diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..28ff073 --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +# These are some examples of commonly ignored file patterns. +# You should customize this list as applicable to your project. +# Learn more about .gitignore: +# https://www.atlassian.com/git/tutorials/saving-changes/gitignore + +# Node artifact files +node_modules/ +dist/ + +# Compiled Java class files +*.class + +# Compiled Python bytecode +*.py[cod] + +# Log files +*.log + +# Package files +*.jar + +# Maven +target/ +dist/ + +# JetBrains IDE +.idea/ + +# Unit test reports +TEST*.xml + +# Generated by MacOS +.DS_Store + +# Generated by Windows +Thumbs.db + +# Applications +*.app +*.exe +*.war + +# Large media files +*.mp4 +*.tiff +*.avi +*.flv +*.mov +*.wmv +/nbproject/private/ diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..335c741 --- /dev/null +++ b/.htaccess @@ -0,0 +1,6 @@ + +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.*)$ index.php/$1 [L] + \ No newline at end of file diff --git a/application/.htaccess b/application/.htaccess new file mode 100644 index 0000000..6c63ed4 --- /dev/null +++ b/application/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + \ No newline at end of file diff --git a/application/cache/index.html b/application/cache/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/cache/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/config/autoload.php b/application/config/autoload.php new file mode 100644 index 0000000..d615d89 --- /dev/null +++ b/application/config/autoload.php @@ -0,0 +1,135 @@ + 'ua'); +*/ +$autoload['libraries'] = array('database', 'email', 'session'); + +/* +| ------------------------------------------------------------------- +| Auto-load Drivers +| ------------------------------------------------------------------- +| These classes are located in system/libraries/ or in your +| application/libraries/ directory, but are also placed inside their +| own subdirectory and they extend the CI_Driver_Library class. They +| offer multiple interchangeable driver options. +| +| Prototype: +| +| $autoload['drivers'] = array('cache'); +| +| You can also supply an alternative property name to be assigned in +| the controller: +| +| $autoload['drivers'] = array('cache' => 'cch'); +| +*/ +$autoload['drivers'] = array(); + +/* +| ------------------------------------------------------------------- +| Auto-load Helper Files +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['helper'] = array('url', 'file'); +*/ +$autoload['helper'] = array('url', 'file','form','custom','pdf'); + +/* +| ------------------------------------------------------------------- +| Auto-load Config files +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['config'] = array('config1', 'config2'); +| +| NOTE: This item is intended for use ONLY if you have created custom +| config files. Otherwise, leave it blank. +| +*/ +$autoload['config'] = array(); + +/* +| ------------------------------------------------------------------- +| Auto-load Language files +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['language'] = array('lang1', 'lang2'); +| +| NOTE: Do not include the "_lang" part of your file. For example +| "codeigniter_lang.php" would be referenced as array('codeigniter'); +| +*/ +$autoload['language'] = array(); + +/* +| ------------------------------------------------------------------- +| Auto-load Models +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['model'] = array('first_model', 'second_model'); +| +| You can also supply an alternative model name to be assigned +| in the controller: +| +| $autoload['model'] = array('first_model' => 'first'); +*/ +$autoload['model'] = array('commonsql_model'); diff --git a/application/config/config.php b/application/config/config.php new file mode 100644 index 0000000..c662d19 --- /dev/null +++ b/application/config/config.php @@ -0,0 +1,523 @@ +]+$/i +| +| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! +| +*/ +$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; + +/* +|-------------------------------------------------------------------------- +| Enable Query Strings +|-------------------------------------------------------------------------- +| +| By default CodeIgniter uses search-engine friendly segment based URLs: +| example.com/who/what/where/ +| +| You can optionally enable standard query string based URLs: +| example.com?who=me&what=something&where=here +| +| Options are: TRUE or FALSE (boolean) +| +| The other items let you set the query string 'words' that will +| invoke your controllers and its functions: +| example.com/index.php?c=controller&m=function +| +| Please note that some of the helpers won't work as expected when +| this feature is enabled, since CodeIgniter is designed primarily to +| use segment based URLs. +| +*/ +$config['enable_query_strings'] = FALSE; +$config['controller_trigger'] = 'c'; +$config['function_trigger'] = 'm'; +$config['directory_trigger'] = 'd'; + +/* +|-------------------------------------------------------------------------- +| Allow $_GET array +|-------------------------------------------------------------------------- +| +| By default CodeIgniter enables access to the $_GET array. If for some +| reason you would like to disable it, set 'allow_get_array' to FALSE. +| +| WARNING: This feature is DEPRECATED and currently available only +| for backwards compatibility purposes! +| +*/ +$config['allow_get_array'] = TRUE; + +/* +|-------------------------------------------------------------------------- +| Error Logging Threshold +|-------------------------------------------------------------------------- +| +| You can enable error logging by setting a threshold over zero. The +| threshold determines what gets logged. Threshold options are: +| +| 0 = Disables logging, Error logging TURNED OFF +| 1 = Error Messages (including PHP errors) +| 2 = Debug Messages +| 3 = Informational Messages +| 4 = All Messages +| +| You can also pass an array with threshold levels to show individual error types +| +| array(2) = Debug Messages, without Error Messages +| +| For a live site you'll usually only enable Errors (1) to be logged otherwise +| your log files will fill up very fast. +| +*/ +$config['log_threshold'] = 0; + +/* +|-------------------------------------------------------------------------- +| Error Logging Directory Path +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| application/logs/ directory. Use a full server path with trailing slash. +| +*/ +$config['log_path'] = ''; + +/* +|-------------------------------------------------------------------------- +| Log File Extension +|-------------------------------------------------------------------------- +| +| The default filename extension for log files. The default 'php' allows for +| protecting the log files via basic scripting, when they are to be stored +| under a publicly accessible directory. +| +| Note: Leaving it blank will default to 'php'. +| +*/ +$config['log_file_extension'] = ''; + +/* +|-------------------------------------------------------------------------- +| Log File Permissions +|-------------------------------------------------------------------------- +| +| The file system permissions to be applied on newly created log files. +| +| IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal +| integer notation (i.e. 0700, 0644, etc.) +*/ +$config['log_file_permissions'] = 0644; + +/* +|-------------------------------------------------------------------------- +| Date Format for Logs +|-------------------------------------------------------------------------- +| +| Each item that is logged has an associated date. You can use PHP date +| codes to set your own date formatting +| +*/ +$config['log_date_format'] = 'Y-m-d H:i:s'; + +/* +|-------------------------------------------------------------------------- +| Error Views Directory Path +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| application/views/errors/ directory. Use a full server path with trailing slash. +| +*/ +$config['error_views_path'] = ''; + +/* +|-------------------------------------------------------------------------- +| Cache Directory Path +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| application/cache/ directory. Use a full server path with trailing slash. +| +*/ +$config['cache_path'] = ''; + +/* +|-------------------------------------------------------------------------- +| Cache Include Query String +|-------------------------------------------------------------------------- +| +| Whether to take the URL query string into consideration when generating +| output cache files. Valid options are: +| +| FALSE = Disabled +| TRUE = Enabled, take all query parameters into account. +| Please be aware that this may result in numerous cache +| files generated for the same page over and over again. +| array('q') = Enabled, but only take into account the specified list +| of query parameters. +| +*/ +$config['cache_query_string'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Encryption Key +|-------------------------------------------------------------------------- +| +| If you use the Encryption class, you must set an encryption key. +| See the user guide for more info. +| +| https://codeigniter.com/user_guide/libraries/encryption.html +| +*/ +$config['encryption_key'] = 'nMTGeuY4aG6yd5ntSXTdgynqX5Qmg0e7'; + +/* +|-------------------------------------------------------------------------- +| Session Variables +|-------------------------------------------------------------------------- +| +| 'sess_driver' +| +| The storage driver to use: files, database, redis, memcached +| +| 'sess_cookie_name' +| +| The session cookie name, must contain only [0-9a-z_-] characters +| +| 'sess_expiration' +| +| The number of SECONDS you want the session to last. +| Setting to 0 (zero) means expire when the browser is closed. +| +| 'sess_save_path' +| +| The location to save sessions to, driver dependent. +| +| For the 'files' driver, it's a path to a writable directory. +| WARNING: Only absolute paths are supported! +| +| For the 'database' driver, it's a table name. +| Please read up the manual for the format with other session drivers. +| +| IMPORTANT: You are REQUIRED to set a valid save path! +| +| 'sess_match_ip' +| +| Whether to match the user's IP address when reading the session data. +| +| WARNING: If you're using the database driver, don't forget to update +| your session table's PRIMARY KEY when changing this setting. +| +| 'sess_time_to_update' +| +| How many seconds between CI regenerating the session ID. +| +| 'sess_regenerate_destroy' +| +| Whether to destroy session data associated with the old session ID +| when auto-regenerating the session ID. When set to FALSE, the data +| will be later deleted by the garbage collector. +| +| Other session cookie settings are shared with the rest of the application, +| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here. +| +*/ +$config['sess_driver'] = 'files'; +$config['sess_cookie_name'] = 'ci_session'; +$config['sess_expiration'] = 7200; +$config['sess_save_path'] = NULL; +$config['sess_match_ip'] = FALSE; +$config['sess_time_to_update'] = 300; +$config['sess_regenerate_destroy'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Cookie Related Variables +|-------------------------------------------------------------------------- +| +| 'cookie_prefix' = Set a cookie name prefix if you need to avoid collisions +| 'cookie_domain' = Set to .your-domain.com for site-wide cookies +| 'cookie_path' = Typically will be a forward slash +| 'cookie_secure' = Cookie will only be set if a secure HTTPS connection exists. +| 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript) +| +| Note: These settings (with the exception of 'cookie_prefix' and +| 'cookie_httponly') will also affect sessions. +| +*/ +$config['cookie_prefix'] = ''; +$config['cookie_domain'] = ''; +$config['cookie_path'] = '/'; +$config['cookie_secure'] = FALSE; +$config['cookie_httponly'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Standardize newlines +|-------------------------------------------------------------------------- +| +| Determines whether to standardize newline characters in input data, +| meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value. +| +| WARNING: This feature is DEPRECATED and currently available only +| for backwards compatibility purposes! +| +*/ +$config['standardize_newlines'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Global XSS Filtering +|-------------------------------------------------------------------------- +| +| Determines whether the XSS filter is always active when GET, POST or +| COOKIE data is encountered +| +| WARNING: This feature is DEPRECATED and currently available only +| for backwards compatibility purposes! +| +*/ +$config['global_xss_filtering'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Cross Site Request Forgery +|-------------------------------------------------------------------------- +| Enables a CSRF cookie token to be set. When set to TRUE, token will be +| checked on a submitted form. If you are accepting user data, it is strongly +| recommended CSRF protection be enabled. +| +| 'csrf_token_name' = The token name +| 'csrf_cookie_name' = The cookie name +| 'csrf_expire' = The number in seconds the token should expire. +| 'csrf_regenerate' = Regenerate token on every submission +| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks +*/ +$config['csrf_protection'] = FALSE; +$config['csrf_token_name'] = 'csrf_test_name'; +$config['csrf_cookie_name'] = 'csrf_cookie_name'; +$config['csrf_expire'] = 7200; +$config['csrf_regenerate'] = TRUE; +$config['csrf_exclude_uris'] = array(); + +/* +|-------------------------------------------------------------------------- +| Output Compression +|-------------------------------------------------------------------------- +| +| Enables Gzip output compression for faster page loads. When enabled, +| the output class will test whether your server supports Gzip. +| Even if it does, however, not all browsers support compression +| so enable only if you are reasonably sure your visitors can handle it. +| +| Only used if zlib.output_compression is turned off in your php.ini. +| Please do not use it together with httpd-level output compression. +| +| VERY IMPORTANT: If you are getting a blank page when compression is enabled it +| means you are prematurely outputting something to your browser. It could +| even be a line of whitespace at the end of one of your scripts. For +| compression to work, nothing can be sent before the output buffer is called +| by the output class. Do not 'echo' any values with compression enabled. +| +*/ +$config['compress_output'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Master Time Reference +|-------------------------------------------------------------------------- +| +| Options are 'local' or any PHP supported timezone. This preference tells +| the system whether to use your server's local time as the master 'now' +| reference, or convert it to the configured one timezone. See the 'date +| helper' page of the user guide for information regarding date handling. +| +*/ +$config['time_reference'] = 'local'; + +/* +|-------------------------------------------------------------------------- +| Rewrite PHP Short Tags +|-------------------------------------------------------------------------- +| +| If your PHP installation does not have short tag support enabled CI +| can rewrite the tags on-the-fly, enabling you to utilize that syntax +| in your view files. Options are TRUE or FALSE (boolean) +| +| Note: You need to have eval() enabled for this to work. +| +*/ +$config['rewrite_short_tags'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Reverse Proxy IPs +|-------------------------------------------------------------------------- +| +| If your server is behind a reverse proxy, you must whitelist the proxy +| IP addresses from which CodeIgniter should trust headers such as +| HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify +| the visitor's IP address. +| +| You can use both an array or a comma-separated list of proxy addresses, +| as well as specifying whole subnets. Here are a few examples: +| +| Comma-separated: '10.0.1.200,192.168.5.0/24' +| Array: array('10.0.1.200', '192.168.5.0/24') +*/ +$config['proxy_ips'] = ''; diff --git a/application/config/constants.php b/application/config/constants.php new file mode 100644 index 0000000..18d3b4b --- /dev/null +++ b/application/config/constants.php @@ -0,0 +1,85 @@ +db->last_query() and profiling of DB queries. +| When you run a query, with this setting set to TRUE (default), +| CodeIgniter will store the SQL statement for debugging purposes. +| However, this may cause high memory usage, especially if you run +| a lot of SQL queries ... disable this to avoid that problem. +| +| The $active_group variable lets you choose which connection group to +| make active. By default there is only one group (the 'default' group). +| +| The $query_builder variables lets you determine whether or not to load +| the query builder class. +*/ +$active_group = 'default'; +$query_builder = TRUE; + +$db['default'] = array( + 'dsn' => '', + 'hostname' => 'localhost', + 'username' => 'root', + 'password' => '', + 'database' => 'policybot', + 'dbdriver' => 'mysqli', + 'dbprefix' => '', + 'pconnect' => FALSE, + 'db_debug' => (ENVIRONMENT !== 'production'), + 'cache_on' => FALSE, + 'cachedir' => '', + 'char_set' => 'utf8', + 'dbcollat' => 'utf8_general_ci', + 'swap_pre' => '', + 'encrypt' => FALSE, + 'compress' => FALSE, + 'stricton' => FALSE, + 'failover' => array(), + 'save_queries' => TRUE +); diff --git a/application/config/doctypes.php b/application/config/doctypes.php new file mode 100644 index 0000000..59a7991 --- /dev/null +++ b/application/config/doctypes.php @@ -0,0 +1,24 @@ + '', + 'xhtml1-strict' => '', + 'xhtml1-trans' => '', + 'xhtml1-frame' => '', + 'xhtml-basic11' => '', + 'html5' => '', + 'html4-strict' => '', + 'html4-trans' => '', + 'html4-frame' => '', + 'mathml1' => '', + 'mathml2' => '', + 'svg10' => '', + 'svg11' => '', + 'svg11-basic' => '', + 'svg11-tiny' => '', + 'xhtml-math-svg-xh' => '', + 'xhtml-math-svg-sh' => '', + 'xhtml-rdfa-1' => '', + 'xhtml-rdfa-2' => '' +); diff --git a/application/config/foreign_chars.php b/application/config/foreign_chars.php new file mode 100644 index 0000000..995f483 --- /dev/null +++ b/application/config/foreign_chars.php @@ -0,0 +1,103 @@ + 'ae', + '/ö|œ/' => 'oe', + '/ü/' => 'ue', + '/Ä/' => 'Ae', + '/Ü/' => 'Ue', + '/Ö/' => 'Oe', + '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A', + '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a', + '/Б/' => 'B', + '/б/' => 'b', + '/Ç|Ć|Ĉ|Ċ|Č/' => 'C', + '/ç|ć|ĉ|ċ|č/' => 'c', + '/Д/' => 'D', + '/д/' => 'd', + '/Ð|Ď|Đ|Δ/' => 'Dj', + '/ð|ď|đ|δ/' => 'dj', + '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Э/' => 'E', + '/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|э/' => 'e', + '/Ф/' => 'F', + '/ф/' => 'f', + '/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G', + '/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g', + '/Ĥ|Ħ/' => 'H', + '/ĥ|ħ/' => 'h', + '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I', + '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i', + '/Ĵ/' => 'J', + '/ĵ/' => 'j', + '/Ķ|Κ|К/' => 'K', + '/ķ|κ|к/' => 'k', + '/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L', + '/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l', + '/М/' => 'M', + '/м/' => 'm', + '/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N', + '/ñ|ń|ņ|ň|ʼn|ν|н/' => 'n', + '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O', + '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o', + '/П/' => 'P', + '/п/' => 'p', + '/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R', + '/ŕ|ŗ|ř|ρ|р/' => 'r', + '/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S', + '/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's', + '/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T', + '/ț|ţ|ť|ŧ|т/' => 't', + '/Þ|þ/' => 'th', + '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U', + '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u', + '/Ƴ|Ɏ|Ỵ|Ẏ|Ӳ|Ӯ|Ў|Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y', + '/ẙ|ʏ|ƴ|ɏ|ỵ|ẏ|ӳ|ӯ|ў|ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y', + '/В/' => 'V', + '/в/' => 'v', + '/Ŵ/' => 'W', + '/ŵ/' => 'w', + '/Ź|Ż|Ž|Ζ|З/' => 'Z', + '/ź|ż|ž|ζ|з/' => 'z', + '/Æ|Ǽ/' => 'AE', + '/ß/' => 'ss', + '/IJ/' => 'IJ', + '/ij/' => 'ij', + '/Œ/' => 'OE', + '/ƒ/' => 'f', + '/ξ/' => 'ks', + '/π/' => 'p', + '/β/' => 'v', + '/μ/' => 'm', + '/ψ/' => 'ps', + '/Ё/' => 'Yo', + '/ё/' => 'yo', + '/Є/' => 'Ye', + '/є/' => 'ye', + '/Ї/' => 'Yi', + '/Ж/' => 'Zh', + '/ж/' => 'zh', + '/Х/' => 'Kh', + '/х/' => 'kh', + '/Ц/' => 'Ts', + '/ц/' => 'ts', + '/Ч/' => 'Ch', + '/ч/' => 'ch', + '/Ш/' => 'Sh', + '/ш/' => 'sh', + '/Щ/' => 'Shch', + '/щ/' => 'shch', + '/Ъ|ъ|Ь|ь/' => '', + '/Ю/' => 'Yu', + '/ю/' => 'yu', + '/Я/' => 'Ya', + '/я/' => 'ya' +); diff --git a/application/config/hooks.php b/application/config/hooks.php new file mode 100644 index 0000000..a8f38a5 --- /dev/null +++ b/application/config/hooks.php @@ -0,0 +1,13 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/config/memcached.php b/application/config/memcached.php new file mode 100644 index 0000000..5c23b39 --- /dev/null +++ b/application/config/memcached.php @@ -0,0 +1,19 @@ + array( + 'hostname' => '127.0.0.1', + 'port' => '11211', + 'weight' => '1', + ), +); diff --git a/application/config/migration.php b/application/config/migration.php new file mode 100644 index 0000000..4b585a6 --- /dev/null +++ b/application/config/migration.php @@ -0,0 +1,84 @@ +migration->current() this is the version that schema will +| be upgraded / downgraded to. +| +*/ +$config['migration_version'] = 0; + +/* +|-------------------------------------------------------------------------- +| Migrations Path +|-------------------------------------------------------------------------- +| +| Path to your migrations folder. +| Typically, it will be within your application path. +| Also, writing permission is required within the migrations path. +| +*/ +$config['migration_path'] = APPPATH.'migrations/'; diff --git a/application/config/mimes.php b/application/config/mimes.php new file mode 100644 index 0000000..0ec9db0 --- /dev/null +++ b/application/config/mimes.php @@ -0,0 +1,184 @@ + array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'), + 'cpt' => 'application/mac-compactpro', + 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'), + 'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'), + 'dms' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'exe' => array('application/octet-stream', 'application/x-msdownload'), + 'class' => 'application/octet-stream', + 'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'), + 'so' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'dll' => 'application/octet-stream', + 'oda' => 'application/oda', + 'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'), + 'ai' => array('application/pdf', 'application/postscript'), + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'mif' => 'application/vnd.mif', + 'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'), + 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'), + 'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'), + 'wbxml' => 'application/wbxml', + 'wmlc' => 'application/wmlc', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'gtar' => 'application/x-gtar', + 'gz' => 'application/x-gzip', + 'gzip' => 'application/x-gzip', + 'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'), + 'php4' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'js' => array('application/x-javascript', 'text/plain'), + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), + 'z' => 'application/x-compress', + 'xhtml' => 'application/xhtml+xml', + 'xht' => 'application/xhtml+xml', + 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'), + 'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'), + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mpga' => 'audio/mpeg', + 'mp2' => 'audio/mpeg', + 'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'), + 'aif' => array('audio/x-aiff', 'audio/aiff'), + 'aiff' => array('audio/x-aiff', 'audio/aiff'), + 'aifc' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'rv' => 'video/vnd.rn-realvideo', + 'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'), + 'bmp' => array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'), + 'gif' => 'image/gif', + 'jpeg' => array('image/jpeg', 'image/pjpeg'), + 'jpg' => array('image/jpeg', 'image/pjpeg'), + 'jpe' => array('image/jpeg', 'image/pjpeg'), + 'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'png' => array('image/png', 'image/x-png'), + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'css' => array('text/css', 'text/plain'), + 'html' => array('text/html', 'text/plain'), + 'htm' => array('text/html', 'text/plain'), + 'shtml' => array('text/html', 'text/plain'), + 'txt' => 'text/plain', + 'text' => 'text/plain', + 'log' => array('text/plain', 'text/x-log'), + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'xml' => array('application/xml', 'text/xml', 'text/plain'), + 'xsl' => array('application/xml', 'text/xsl', 'text/xml'), + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'), + 'movie' => 'video/x-sgi-movie', + 'doc' => array('application/msword', 'application/vnd.ms-office'), + 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'), + 'dot' => array('application/msword', 'application/vnd.ms-office'), + 'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'), + 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'), + 'word' => array('application/msword', 'application/octet-stream'), + 'xl' => 'application/excel', + 'eml' => 'message/rfc822', + 'json' => array('application/json', 'text/json'), + 'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'), + 'p10' => array('application/x-pkcs10', 'application/pkcs10'), + 'p12' => 'application/x-pkcs12', + 'p7a' => 'application/x-pkcs7-signature', + 'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), + 'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'crt' => array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'), + 'crl' => array('application/pkix-crl', 'application/pkcs-crl'), + 'der' => 'application/x-x509-ca-cert', + 'kdb' => 'application/octet-stream', + 'pgp' => 'application/pgp', + 'gpg' => 'application/gpg-keys', + 'sst' => 'application/octet-stream', + 'csr' => 'application/octet-stream', + 'rsa' => 'application/x-pkcs7', + 'cer' => array('application/pkix-cert', 'application/x-x509-ca-cert'), + '3g2' => 'video/3gpp2', + '3gp' => array('video/3gp', 'video/3gpp'), + 'mp4' => 'video/mp4', + 'm4a' => 'audio/x-m4a', + 'f4v' => array('video/mp4', 'video/x-f4v'), + 'flv' => 'video/x-flv', + 'webm' => 'video/webm', + 'aac' => 'audio/x-acc', + 'm4u' => 'application/vnd.mpegurl', + 'm3u' => 'text/plain', + 'xspf' => 'application/xspf+xml', + 'vlc' => 'application/videolan', + 'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'), + 'au' => 'audio/x-au', + 'ac3' => 'audio/ac3', + 'flac' => 'audio/x-flac', + 'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'), + 'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'), + 'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'), + 'ics' => 'text/calendar', + 'ical' => 'text/calendar', + 'zsh' => 'text/x-scriptzsh', + '7z' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'), + '7zip' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'), + 'cdr' => array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'), + 'wma' => array('audio/x-ms-wma', 'video/x-ms-asf'), + 'jar' => array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'), + 'svg' => array('image/svg+xml', 'application/xml', 'text/xml'), + 'vcf' => 'text/x-vcard', + 'srt' => array('text/srt', 'text/plain'), + 'vtt' => array('text/vtt', 'text/plain'), + 'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'), + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'otf' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web' +); diff --git a/application/config/profiler.php b/application/config/profiler.php new file mode 100644 index 0000000..3db22e3 --- /dev/null +++ b/application/config/profiler.php @@ -0,0 +1,14 @@ + array('grin.gif', '19', '19', 'grin'), + ':lol:' => array('lol.gif', '19', '19', 'LOL'), + ':cheese:' => array('cheese.gif', '19', '19', 'cheese'), + ':)' => array('smile.gif', '19', '19', 'smile'), + ';-)' => array('wink.gif', '19', '19', 'wink'), + ';)' => array('wink.gif', '19', '19', 'wink'), + ':smirk:' => array('smirk.gif', '19', '19', 'smirk'), + ':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'), + ':-S' => array('confused.gif', '19', '19', 'confused'), + ':wow:' => array('surprise.gif', '19', '19', 'surprised'), + ':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'), + ':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'), + '%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'), + ';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'), + ':P' => array('raspberry.gif', '19', '19', 'raspberry'), + ':blank:' => array('blank.gif', '19', '19', 'blank stare'), + ':long:' => array('longface.gif', '19', '19', 'long face'), + ':ohh:' => array('ohh.gif', '19', '19', 'ohh'), + ':grrr:' => array('grrr.gif', '19', '19', 'grrr'), + ':gulp:' => array('gulp.gif', '19', '19', 'gulp'), + '8-/' => array('ohoh.gif', '19', '19', 'oh oh'), + ':down:' => array('downer.gif', '19', '19', 'downer'), + ':red:' => array('embarrassed.gif', '19', '19', 'red face'), + ':sick:' => array('sick.gif', '19', '19', 'sick'), + ':shut:' => array('shuteye.gif', '19', '19', 'shut eye'), + ':-/' => array('hmm.gif', '19', '19', 'hmmm'), + '>:(' => array('mad.gif', '19', '19', 'mad'), + ':mad:' => array('mad.gif', '19', '19', 'mad'), + '>:-(' => array('angry.gif', '19', '19', 'angry'), + ':angry:' => array('angry.gif', '19', '19', 'angry'), + ':zip:' => array('zip.gif', '19', '19', 'zipper'), + ':kiss:' => array('kiss.gif', '19', '19', 'kiss'), + ':ahhh:' => array('shock.gif', '19', '19', 'shock'), + ':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'), + ':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'), + ':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'), + ':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'), + ':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'), + ':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'), + ':vampire:' => array('vampire.gif', '19', '19', 'vampire'), + ':snake:' => array('snake.gif', '19', '19', 'snake'), + ':exclaim:' => array('exclaim.gif', '19', '19', 'exclaim'), + ':question:' => array('question.gif', '19', '19', 'question') + +); diff --git a/application/config/user_agents.php b/application/config/user_agents.php new file mode 100644 index 0000000..b6c8563 --- /dev/null +++ b/application/config/user_agents.php @@ -0,0 +1,214 @@ + 'Windows 10', + 'windows nt 6.3' => 'Windows 8.1', + 'windows nt 6.2' => 'Windows 8', + 'windows nt 6.1' => 'Windows 7', + 'windows nt 6.0' => 'Windows Vista', + 'windows nt 5.2' => 'Windows 2003', + 'windows nt 5.1' => 'Windows XP', + 'windows nt 5.0' => 'Windows 2000', + 'windows nt 4.0' => 'Windows NT 4.0', + 'winnt4.0' => 'Windows NT 4.0', + 'winnt 4.0' => 'Windows NT', + 'winnt' => 'Windows NT', + 'windows 98' => 'Windows 98', + 'win98' => 'Windows 98', + 'windows 95' => 'Windows 95', + 'win95' => 'Windows 95', + 'windows phone' => 'Windows Phone', + 'windows' => 'Unknown Windows OS', + 'android' => 'Android', + 'blackberry' => 'BlackBerry', + 'iphone' => 'iOS', + 'ipad' => 'iOS', + 'ipod' => 'iOS', + 'os x' => 'Mac OS X', + 'ppc mac' => 'Power PC Mac', + 'freebsd' => 'FreeBSD', + 'ppc' => 'Macintosh', + 'linux' => 'Linux', + 'debian' => 'Debian', + 'sunos' => 'Sun Solaris', + 'beos' => 'BeOS', + 'apachebench' => 'ApacheBench', + 'aix' => 'AIX', + 'irix' => 'Irix', + 'osf' => 'DEC OSF', + 'hp-ux' => 'HP-UX', + 'netbsd' => 'NetBSD', + 'bsdi' => 'BSDi', + 'openbsd' => 'OpenBSD', + 'gnu' => 'GNU/Linux', + 'unix' => 'Unknown Unix OS', + 'symbian' => 'Symbian OS' +); + + +// The order of this array should NOT be changed. Many browsers return +// multiple browser types so we want to identify the sub-type first. +$browsers = array( + 'OPR' => 'Opera', + 'Flock' => 'Flock', + 'Edge' => 'Edge', + 'Chrome' => 'Chrome', + // Opera 10+ always reports Opera/9.80 and appends Version/ to the user agent string + 'Opera.*?Version' => 'Opera', + 'Opera' => 'Opera', + 'MSIE' => 'Internet Explorer', + 'Internet Explorer' => 'Internet Explorer', + 'Trident.* rv' => 'Internet Explorer', + 'Shiira' => 'Shiira', + 'Firefox' => 'Firefox', + 'Chimera' => 'Chimera', + 'Phoenix' => 'Phoenix', + 'Firebird' => 'Firebird', + 'Camino' => 'Camino', + 'Netscape' => 'Netscape', + 'OmniWeb' => 'OmniWeb', + 'Safari' => 'Safari', + 'Mozilla' => 'Mozilla', + 'Konqueror' => 'Konqueror', + 'icab' => 'iCab', + 'Lynx' => 'Lynx', + 'Links' => 'Links', + 'hotjava' => 'HotJava', + 'amaya' => 'Amaya', + 'IBrowse' => 'IBrowse', + 'Maxthon' => 'Maxthon', + 'Ubuntu' => 'Ubuntu Web Browser' +); + +$mobiles = array( + // legacy array, old values commented out + 'mobileexplorer' => 'Mobile Explorer', +// 'openwave' => 'Open Wave', +// 'opera mini' => 'Opera Mini', +// 'operamini' => 'Opera Mini', +// 'elaine' => 'Palm', + 'palmsource' => 'Palm', +// 'digital paths' => 'Palm', +// 'avantgo' => 'Avantgo', +// 'xiino' => 'Xiino', + 'palmscape' => 'Palmscape', +// 'nokia' => 'Nokia', +// 'ericsson' => 'Ericsson', +// 'blackberry' => 'BlackBerry', +// 'motorola' => 'Motorola' + + // Phones and Manufacturers + 'motorola' => 'Motorola', + 'nokia' => 'Nokia', + 'palm' => 'Palm', + 'iphone' => 'Apple iPhone', + 'ipad' => 'iPad', + 'ipod' => 'Apple iPod Touch', + 'sony' => 'Sony Ericsson', + 'ericsson' => 'Sony Ericsson', + 'blackberry' => 'BlackBerry', + 'cocoon' => 'O2 Cocoon', + 'blazer' => 'Treo', + 'lg' => 'LG', + 'amoi' => 'Amoi', + 'xda' => 'XDA', + 'mda' => 'MDA', + 'vario' => 'Vario', + 'htc' => 'HTC', + 'samsung' => 'Samsung', + 'sharp' => 'Sharp', + 'sie-' => 'Siemens', + 'alcatel' => 'Alcatel', + 'benq' => 'BenQ', + 'ipaq' => 'HP iPaq', + 'mot-' => 'Motorola', + 'playstation portable' => 'PlayStation Portable', + 'playstation 3' => 'PlayStation 3', + 'playstation vita' => 'PlayStation Vita', + 'hiptop' => 'Danger Hiptop', + 'nec-' => 'NEC', + 'panasonic' => 'Panasonic', + 'philips' => 'Philips', + 'sagem' => 'Sagem', + 'sanyo' => 'Sanyo', + 'spv' => 'SPV', + 'zte' => 'ZTE', + 'sendo' => 'Sendo', + 'nintendo dsi' => 'Nintendo DSi', + 'nintendo ds' => 'Nintendo DS', + 'nintendo 3ds' => 'Nintendo 3DS', + 'wii' => 'Nintendo Wii', + 'open web' => 'Open Web', + 'openweb' => 'OpenWeb', + + // Operating Systems + 'android' => 'Android', + 'symbian' => 'Symbian', + 'SymbianOS' => 'SymbianOS', + 'elaine' => 'Palm', + 'series60' => 'Symbian S60', + 'windows ce' => 'Windows CE', + + // Browsers + 'obigo' => 'Obigo', + 'netfront' => 'Netfront Browser', + 'openwave' => 'Openwave Browser', + 'mobilexplorer' => 'Mobile Explorer', + 'operamini' => 'Opera Mini', + 'opera mini' => 'Opera Mini', + 'opera mobi' => 'Opera Mobile', + 'fennec' => 'Firefox Mobile', + + // Other + 'digital paths' => 'Digital Paths', + 'avantgo' => 'AvantGo', + 'xiino' => 'Xiino', + 'novarra' => 'Novarra Transcoder', + 'vodafone' => 'Vodafone', + 'docomo' => 'NTT DoCoMo', + 'o2' => 'O2', + + // Fallback + 'mobile' => 'Generic Mobile', + 'wireless' => 'Generic Mobile', + 'j2me' => 'Generic Mobile', + 'midp' => 'Generic Mobile', + 'cldc' => 'Generic Mobile', + 'up.link' => 'Generic Mobile', + 'up.browser' => 'Generic Mobile', + 'smartphone' => 'Generic Mobile', + 'cellphone' => 'Generic Mobile' +); + +// There are hundreds of bots but these are the most common. +$robots = array( + 'googlebot' => 'Googlebot', + 'msnbot' => 'MSNBot', + 'baiduspider' => 'Baiduspider', + 'bingbot' => 'Bing', + 'slurp' => 'Inktomi Slurp', + 'yahoo' => 'Yahoo', + 'ask jeeves' => 'Ask Jeeves', + 'fastcrawler' => 'FastCrawler', + 'infoseek' => 'InfoSeek Robot 1.0', + 'lycos' => 'Lycos', + 'yandex' => 'YandexBot', + 'mediapartners-google' => 'MediaPartners Google', + 'CRAZYWEBCRAWLER' => 'Crazy Webcrawler', + 'adsbot-google' => 'AdsBot Google', + 'feedfetcher-google' => 'Feedfetcher Google', + 'curious george' => 'Curious George', + 'ia_archiver' => 'Alexa Crawler', + 'MJ12bot' => 'Majestic-12', + 'Uptimebot' => 'Uptimebot' +); diff --git a/application/controllers/Blog.php b/application/controllers/Blog.php new file mode 100644 index 0000000..103243f --- /dev/null +++ b/application/controllers/Blog.php @@ -0,0 +1,174 @@ +load->model('Blog_model'); + + + } + function list_blog() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['blo']=$this->Blog_model->list_blogs(); + $this->load->view('admin/blog/list',$data); + } + function add_blog() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post("add")) + { + $Title=$this->input->post("Title"); + $tags=$this->input->post("tags"); + $Detail=$this->input->post("Detail"); + $tg =array(); + foreach($tags as $key1=>$val1) + { + $tg[]=$tags[$key1]; + } + $tg_res= implode(', ', $tg); + //make directory + + if (!is_dir('uploads/blog')) { + mkdir('./uploads/blog', 0777, TRUE); + + } + + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/blog/'; // upload directory + + if($_FILES['Image']) + { + + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $path = $path.strtolower($final_image); + + if(move_uploaded_file($tmp,$path)) + { + $table="blog"; + $rvalue=array( + 'name'=>$Title, + 'intro'=>$Detail, + 'image'=>$path, + 'tags'=>$tg_res, + 'cdate'=>date('Y-m-d H:i:s'), + 'cby'=>$this->session->userdata('id'), + 'status'=>1); + + $result=$this->commonsql_model->insert_table($table,$rvalue); + + + } } } + if($result) + { + $this->session->set_userdata('suc','successfully added'); + redirect('admin/blog'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/blog'); + } + + + } + $this->load->view('admin/blog/add'); + } + function edit_blog($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post("edit")) + { + $Title=$this->input->post("Title"); + $tags=$this->input->post("tags"); + $Detail=$this->input->post("Detail"); + $oldimage=$this->input->post("old_image"); + $Image=$this->input->post("Image"); + $tg =array(); + foreach($tags as $key1=>$val1) + { + $tg[]=$tags[$key1]; + } + $tg_res= implode(', ', $tg); + if($Image=="") { + $simage=$oldimage; + } + if (!is_dir('uploads/blog')) { + mkdir('./uploads/blog', 0777, TRUE); + + } + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/blog/'; // upload directory + + if($_FILES['Image']['tmp_name']) + { + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $simage = $path.strtolower($final_image); + if(move_uploaded_file($tmp,$simage)) + {}} } + $tblname="blog"; + $wheredata=(array('id'=>$id)); + $values=array( + 'name'=>$Title, + 'intro'=>$Detail, + 'image'=>$simage, + 'tags'=>$tg_res, + 'udate'=>date('Y-m-d H:i:s'), + 'uby'=>$this->session->userdata('id'), + ); + $result=$this->commonsql_model->updateTable($tblname,$wheredata,$values); + if($result) + { + $this->session->set_userdata('suc','successfully Updated'); + redirect('admin/blog'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/blog'); + } + + + } + $data['blo']=$this->Blog_model->list_blogs($id); + $this->load->view('admin/blog/edit',$data); + } + function check_uncheck_blog() + { + $id=$_POST['id']; + $value=$_POST['val']; + $tblname="blog"; + $where=array('id'=>$id); + $update=array('status'=>$value); + $results=$this->commonsql_model->updateTable($tblname,$where,$update); + if($results) + { + echo "1"; + } + else + { + echo "2"; + } + } +} +?> \ No newline at end of file diff --git a/application/controllers/Category.php b/application/controllers/Category.php new file mode 100644 index 0000000..6e23cf6 --- /dev/null +++ b/application/controllers/Category.php @@ -0,0 +1,443 @@ +load->model('Category_model'); + } + function list_category() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['cat']=$this->Category_model->list_cat(); + $this->load->view('admin/category/list',$data); + } + function add_category() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('cat')) + { + $name=$this->input->post('catname'); + $short_des=$this->input->post('short_des'); + + + $comparefields=$this->input->post('comparefields'); + $questions=$this->input->post('questions'); + $options=$this->input->post('options'); + $optionmethods=$this->input->post('optionmethods'); + $Documents=$this->input->post('Documents'); + //make directory + + if (!is_dir('uploads/category')) { + mkdir('./uploads/category', 0777, TRUE); + + } + + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/category/'; // upload directory + + if($_FILES['Image']) + { + + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $path = $path.strtolower($final_image); + + if(move_uploaded_file($tmp,$path)) + { + $table="categories"; + $rvalue=array( + 'name'=>$name, + 'short_description'=>$short_des, + 'icon'=>$path, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$rvalue); + $catid=$this->db->insert_id(); + + } } } + // document details + foreach($Documents as $ke=>$val) + { + $tblname="documents_master"; + if (is_numeric($Documents[$ke])){ + + $did = $Documents[$ke]; + } + else{ + + $values=array('name'=>ucwords($Documents[$ke]), + 'status'=>1); + + if($Documents[$ke]!="") { + $result=$this->commonsql_model->insert_table($tblname,$values); + } + $did = $this->db->insert_id(); + + } + $tblnames="category_document_details"; + $value=array( + 'category'=>$catid, + 'document'=>$did , + 'status'=>1); + if($catid!="" && $did!="") { + $result=$this->commonsql_model->insert_table($tblnames,$value); + } + } + // compare details + foreach($comparefields as $ke=>$val) + { + $tblname="category_compare_master"; + if (is_numeric($comparefields[$ke])){ + + $cid = $comparefields[$ke]; + } + else{ + + $values=array('compare_name'=>ucwords($comparefields[$ke]), + 'status'=>1); + + if($comparefields[$ke]!="") { + $result=$this->commonsql_model->insert_table($tblname,$values); + } + $cid = $this->db->insert_id(); + + } + $tblnames="category_compare_detail"; + $value=array( + 'category'=>$catid, + 'compare'=>$cid , + 'status'=>1); + if($catid!="" && $cid!="") { + $result=$this->commonsql_model->insert_table($tblnames,$value); + } + } + foreach($questions as $que=>$que_va) + { + $optionsnew=$options[$que];$opti=array(); + foreach($optionsnew as $opt=>$optval) + { + $opti[]=$options[$que][$opt]; + + + }$opt_res= implode('|', $opti); + $tblname="category_questions_before_quote"; + $value=array( + 'category'=>$catid, + 'question'=>$questions[$que], + 'option_input_type'=>$optionmethods[$que], + 'options'=>$opt_res, + 'status'=>1); + if($questions[$que]!=""){ + $result=$this->commonsql_model->insert_table($tblname,$value); + } + } + + if($result) + { + $this->session->set_userdata('suc','successfully added'); + redirect('admin/category'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/category'); + } + + } + $data['catcom']=$this->Category_model->get_compare_master(); + $data['doccom']=$this->Category_model->get_document_master(); + $this->load->view('admin/category/add',$data); + } + function cataction() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + + $type=$_POST['type']; //types like view, edit etc., + $id=$_POST['id']; + + //selecting table + $tableName="categories"; + $select=array('id','name','icon'); + $where=array('id'=>$id); + $data['cat']=$this->commonsql_model->selectTable($tableName,$where,$select); + $data['type']=$type; + $this->load->view('admin/category/cataction',$data); + + + } + function view_category($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['cat']=$this->Category_model->list_cat($id); + $data['com']=$this->Category_model->get_compare_details($id); + $data['quest']=$this->Category_model->questions_before_quote($id); + $data['doc']=$this->Category_model->get_document_details($id); + $this->load->view('admin/category/view',$data); + } + function edit_category($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('cat')) + { + $name=$this->input->post('cmpname'); + $oldimage=$this->input->post("old_image"); + $image=$this->input->post("Image"); + $short_des=$this->input->post("short_des"); + $comparefields=$this->input->post("comparefields"); + $Documentsfields=$this->input->post("Documents"); + $hiddenprimary=$this->input->post("hiddenprimary"); + $questions=$this->input->post('questions'); + $options=$this->input->post('options'); + $optionmethods=$this->input->post('optionmethods'); + if($Image=="") { + $simage=$oldimage; + } + if (!is_dir('uploads/category')) { + mkdir('./uploads/category', 0777, TRUE); + + } + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/category/'; // upload directory + + if($_FILES['Image']['tmp_name']) + { + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $simage = $path.strtolower($final_image); + if(move_uploaded_file($tmp,$simage)) + {}} } + $tblname="categories"; + $wheredata=(array('id'=>$id)); + $values=array( + 'name'=>$name, + 'short_description'=>$short_des, + 'icon'=>$simage, + 'udate'=>date('Y-m-d H:i:s'), + + ); + $result=$this->commonsql_model->updateTable($tblname,$wheredata,$values); + /* comparision edit */ + $exist_tag=$this->Category_model->get_compare_details($id); + + if($exist_tag->num_rows()>0) + { + $oldcompare=array(); + + foreach($exist_tag->result() as $list) + { + $oldcompare[]=$list->compare ; + + } + } + //different1 + $diff=array_diff($oldcompare,$comparefields); + if($diff>0){ + foreach($diff as $value){ + $where=array('compare'=>$value,'category'=>$id); + $tablename="category_compare_detail"; + $values=array('status'=>0); + $product=$this->commonsql_model->updateTable($tablename,$where,$values); + } + } + //new one + $diffnew=array_diff($comparefields,$oldcompare); + if($diffnew>0) + { + foreach ($diffnew as $new_tag) + { + $tblname="category_compare_master"; + if (is_numeric($new_tag)){ + + $cid = $new_tag; + } + else{ + + $values=array('compare_name'=>ucwords($new_tag), + 'status'=>1); + + if($new_tag!="") { + $result=$this->commonsql_model->insert_table($tblname,$values); + } + $cid = $this->db->insert_id(); + + } + $tblnames="category_compare_detail"; + $value=array( + 'category'=>$id, + 'compare'=>$cid , + 'status'=>1); + if($id!="" && $cid!="") { + $result=$this->commonsql_model->insert_table($tblnames,$value); + } + } + } + /* end of comparision edit */ + /* Documentsfields edit */ + $exist_tags=$this->Category_model->get_document_details($id); + + if($exist_tags->num_rows()>0) + { + $olddocument=array(); + + foreach($exist_tags->result() as $lists) + { + $olddocument[]=$lists->document ; + + } + } + //different1 + $diffs=array_diff($olddocument,$Documentsfields); + if($diffs>0){ + foreach($diffs as $value){ + $where=array('document'=>$value,'category'=>$id); + $tablename="category_document_details"; + $values=array('status'=>0); + $product=$this->commonsql_model->updateTable($tablename,$where,$values); + } + } + //new one + $diffnews=array_diff($Documentsfields,$olddocument); + if($diffnews>0) + { + foreach ($diffnews as $new_tags) + { + $tblname="documents_master"; + if (is_numeric($new_tags)){ + + $cdid = $new_tags; + } + else{ + + $values=array('name'=>ucwords($new_tags), + 'status'=>1); + + if($new_tags!="") { + $result=$this->commonsql_model->insert_table($tblname,$values); + } + $cdid = $this->db->insert_id(); + + } + $tblnames="category_document_details"; + $value=array( + 'category'=>$id, + 'document'=>$cdid , + 'status'=>1); + if($id!="" && $cdid!="") { + $result=$this->commonsql_model->insert_table($tblnames,$value); + } + } + } + /* end of comparision edit */ + /* delete entire row minus */ + foreach($questions as $que=>$que_va) + { + $optionsnew=$options[$que];$opti=array(); + foreach($optionsnew as $opt=>$optval) + { + $opti[]=$options[$que][$opt]; + + + }$opt_res= implode('|', $opti); + + $tblname="category_questions_before_quote"; + $value=array( + 'category'=>$id, + 'question'=>$questions[$que], + 'option_input_type'=>$optionmethods[$que], + 'options'=>$opt_res, + 'status'=>1); + if($hiddenprimary[$que]==""){ + if($questions[$que]!=""){ + $result=$this->commonsql_model->insert_table($tblname,$value); + } + } + if($hiddenprimary[$que]!=""){ + + $where=array("id"=>$hiddenprimary[$que]); + $result=$this->commonsql_model->updateTable($tblname,$where,$value); + + } + } + /* end of delete entire row minus */ + if($result) + { + $this->session->set_userdata('suc','successfully Updated'); + redirect('admin/category'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/category'); + } + } + $data['catcom']=$this->Category_model->get_compare_master(); + $data['doccom']=$this->Category_model->get_document_master(); + $data['cat']=$this->Category_model->list_cat($id); + $data['com']=$this->Category_model->get_compare_details($id); + $data['quest']=$this->Category_model->questions_before_quote($id); + $data['doc']=$this->Category_model->get_document_details($id); + $this->load->view('admin/category/edit',$data); + } + function delete_category($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('yes')) + { + + $table="categories"; + //echo $ledgername; + $values=array( + 'status'=>0); + $where=array("id"=>$id); + $result=$this->commonsql_model->updatetable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','successfully deleted'); + redirect('admin/category'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/category'); + } + } + } + function delete_minus_questions() + { + $rid=$_POST['rid']; + $table="category_questions_before_quote"; + //echo $ledgername; + $values=array( + 'status'=>0); + $where=array("id"=>$rid); + $result=$this->commonsql_model->updatetable($table,$where,$values); + if($result) + { + echo "1"; + } + else + { + echo "2"; + } + } +} +?> \ No newline at end of file diff --git a/application/controllers/Company.php b/application/controllers/Company.php new file mode 100644 index 0000000..cca19c5 --- /dev/null +++ b/application/controllers/Company.php @@ -0,0 +1,168 @@ +load->model('Company_model'); + } + function list_company() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['cmp']=$this->Company_model->list_cmp(); + $this->load->view('admin/company/list',$data); + } + function add_company() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('cmp')) + { + $name=$this->input->post('cmpname'); + //make directory + + if (!is_dir('uploads/company')) { + mkdir('./uploads/company', 0777, TRUE); + + } + + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/company/'; // upload directory + + if($_FILES['Image']) + { + + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $path = $path.strtolower($final_image); + + if(move_uploaded_file($tmp,$path)) + { + $table="companies"; + //echo $ledgername; + $values=array('name'=>$name, + 'logo'=>$path, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$values); + + } } } + + if($result) + { + $this->session->set_userdata('suc','successfully added'); + redirect('admin/company'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/company'); + } + + } + } + function cmpaction() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + + $type=$_POST['type']; //types like view, edit etc., + $id=$_POST['id']; + + //selecting table + $tableName="companies"; + $select=array('id','name','logo'); + $where=array('id'=>$id); + $data['cmp']=$this->commonsql_model->selectTable($tableName,$where,$select); + $data['type']=$type; + $this->load->view('admin/company/cmpaction',$data); + + + } + function edit_company($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('cmp')) + { + $name=$this->input->post('cmpname'); + $image=$this->input->post("Image"); + $oldimage=$this->input->post("old_image"); + if($Image=="") { + $simage=$oldimage; + } + if (!is_dir('uploads/company')) { + mkdir('./uploads/company', 0777, TRUE); + + } + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/company/'; // upload directory + + if($_FILES['Image']['tmp_name']) + { + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $simage = $path.strtolower($final_image); + if(move_uploaded_file($tmp,$simage)) + {}} } + $table="companies"; + //echo $ledgername; + $values=array('name'=>$name,'logo'=>$simage, + 'udate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $where=array("id"=>$id); + $result=$this->commonsql_model->updatetable($table,$where,$values); + + if($result) + { + $this->session->set_userdata('suc','successfully updated'); + redirect('admin/company'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/company'); + } + } + } + function delete_company($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('yes')) + { + + $table="companies"; + //echo $ledgername; + $values=array( + 'status'=>0); + $where=array("id"=>$id); + $result=$this->commonsql_model->updatetable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','successfully deleted'); + redirect('admin/company'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/company'); + } + } + } +} +?> \ No newline at end of file diff --git a/application/controllers/Dashboard.php b/application/controllers/Dashboard.php new file mode 100644 index 0000000..a8a784b --- /dev/null +++ b/application/controllers/Dashboard.php @@ -0,0 +1,32 @@ +load->model('Dashboard_model'); + + + } + function get_dashboard_detail_content() + { + + $id=$_POST["id"]; + if($id=="1") + { + $quo_det=$this->Dashboard_model->get_quotes_details(); + } + if($id=="2") + { + $quo_det=$this->Dashboard_model->get_request_details(); + } + if($id=="3") + { + $quo_det=$this->Dashboard_model->get_response_details(); + } + + } + +} +?> \ No newline at end of file diff --git a/application/controllers/Faq.php b/application/controllers/Faq.php new file mode 100644 index 0000000..c147c14 --- /dev/null +++ b/application/controllers/Faq.php @@ -0,0 +1,98 @@ +load->model('Faq_model'); + } + function list_faq() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['faq']=$this->Faq_model->list_faq(); + $this->load->view('admin/faq/list',$data); + } + function add_faq() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('add')) + { + $Question=$this->input->post('Question'); + $Answer=$this->input->post('Answer'); + $table="faq"; + //echo $ledgername; + $values=array('question'=>$Question, + 'answer'=>$Answer, + 'cdate'=>date('Y-m-d H:i:s'), + + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$values); + if($result) + { + $this->session->set_userdata('suc','successfully added'); + redirect('admin/faq'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/faq'); + } + + } + $this->load->view('admin/faq/add'); + } + + function edit_faq($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('edit')) + { + + $Question=$this->input->post('Question'); + $Answer=$this->input->post('Answer'); + $table="faq"; + //echo $ledgername; + $values=array('question'=>$Question, + 'answer'=>$Answer, + 'udate'=>date('Y-m-d H:i:s'), + + 'status'=>1); + $where=array("id"=>$id); + $result=$this->commonsql_model->updatetable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','successfully updated'); + redirect('admin/faq'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/faq'); + } + } + $data['faq']=$this->Faq_model->list_faq($id); + + $this->load->view('admin/faq/edit',$data); + } + function check_uncheck_faq() + { + $id=$_POST['id']; + $value=$_POST['val']; + $tblname="faq"; + $where=array('id'=>$id); + $update=array('status'=>$value); + $results=$this->commonsql_model->updateTable($tblname,$where,$update); + if($results) + { + echo "1"; + } + else + { + echo "2"; + } + } +} +?> \ No newline at end of file diff --git a/application/controllers/Frontend.php b/application/controllers/Frontend.php new file mode 100644 index 0000000..1d2cad0 --- /dev/null +++ b/application/controllers/Frontend.php @@ -0,0 +1,1426 @@ +load->model('Frontend_model'); + $this->load->model('Company_model'); + $this->load->model('Category_model'); + + + } + function home() + { + $data['pol']=$this->Frontend_model->list_policy(); + $this->load->view('front/index',$data); + } + function becoame_agent() + { + if($this->input->post('becomeagent')) + { + $fullname = $this->input->post('agent_name'); + $email = $this->input->post('agent_email'); + $mobile = $this->input->post('agent_mobile'); + $pincode = $this->input->post('agent_pincode'); + $agent_cmp = $this->input->post('agent_cmp'); + $agent_cat = $this->input->post('agent_cat'); + $agent_lang = $this->input->post('agent_lang'); + $password = $this->input->post('agent_pass'); + $conform_password = $this->input->post('agent_cpass'); + + $lang =array(); + foreach($agent_lang as $key=>$val) + { + $lang[]=$agent_lang[$key]; + } + $lang_res= implode(', ', $lang); + + $cat =array(); + foreach($agent_cat as $key=>$val) + { + $cat[]=$agent_cat[$key]; + } + $cat_res= implode(', ', $cat); + $table="users"; + $values=array('userrole'=>1,//agent + 'name'=>$fullname, + 'email'=>$email, + 'password'=>md5($password), + 'mobile'=>$mobile, + 'pincode'=>$pincode, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>0); + $result=$this->commonsql_model->insert_table($table,$values); + $agent_id=$this->db->insert_id(); + + $table="agents"; + $values=array('user_id'=>$agent_id,//agent + 'category'=>$cat_res, + 'racetype'=>$lang_res, + 'pincode'=>$pincode, + 'company'=>$agent_cmp, + 'category_notify'=>0,//initially 0 for chance to edit once + 'racetype_notify'=>0,//initially 0 for chance to edit once + 'company_notify'=>0,//initially 0 for chance to edit once + 'status'=>0); + $result=$this->commonsql_model->insert_table($table,$values); + + $from_email = "kaleeswari.dotwings@gmail.com"; + $to_email = $email; + + //Load email library + $this->load->library('email'); + + $this->email->from($from_email, 'Policybot'); + $this->email->to($to_email); + $this->email->set_header('Content-Type', 'text/html'); + + $this->email->subject('Policybot Email Verification'); + $this->email->message(' +

Verify Your Email Account

+

Hai '.$fullname.'

Thank you for Showing interest with us.

+

Please click the below button to verify your email.

+ + + '); + $emailsent=$this->email->send(); + + if($emailsent) + { + $this->session->set_userdata('suc','Registeration completed successfully.Kindly verify your mail to activate this account..!'); + redirect('home'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('home'); + } + + } + $data['cmp']=$this->Company_model->list_cmp(); + $data['cat']=$this->Category_model->list_cat(); + $data['race']=$this->Frontend_model->agent_racetype(); + $this->load->view('front/become_agent',$data); + } + function list_policy() + { + $data['pol']=$this->Frontend_model->list_policy(); + $this->load->view('front/policy-list',$data); + } + function policy_detail($id) + { + $data['pol']=$this->Frontend_model->list_policy($id); + $data['pols']=$this->Frontend_model->list_policy(); + + $this->load->view('front/policy-detail',$data); + } + function emailcheck() + { + $email=$_POST['email']; + $tables="users"; + $wheres=array("email"=>$email); + $shows=("*"); + $emailex=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if($emailex->num_rows()>0){ + echo "1"; + } + else + + { + echo "2"; + } + } + function enq_emailcheck() + { + $email=$_POST['email']; + $tables="users"; + $wheres=array("email"=>$email); + $shows=("*"); + $emailex=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if($emailex->num_rows()>0){ + $ee=$emailex->row(); + $estatus=$ee->status; + $id=$ee->id; + if($estatus=="1") + { + echo "1_".$id; + } + if($estatus=="0") + { + echo "2_0"; + } + } + else + { + echo "3_0"; + } + } + function register() + { + $fullname = $this->input->post('rfullname'); + $email = $this->input->post('remail'); + $mobile = $this->input->post('rmobile'); + $pincode = $this->input->post('rpincode'); + $password = $this->input->post('password'); + $conform_password = $this->input->post('conform_password'); + + $table="users"; + $values=array('userrole'=>0,//user + 'name'=>$fullname, + 'email'=>$email, + 'password'=>md5($password), + 'mobile'=>$mobile, + 'pincode'=>$pincode, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>0); + $result=$this->commonsql_model->insert_table($table,$values); + $userid=$this->db->insert_id(); + $from_email = "kaleeswari.dotwings@gmail.com"; + $to_email = $email; + + //Load email library + $this->load->library('email'); + + $this->email->from($from_email, 'Policybot'); + $this->email->to($to_email); + ; + $this->email->set_header('Content-Type', 'text/html'); + + $this->email->subject('Policybot Email Verification'); + $this->email->message(' +

Verify Your Email Account

+

Hai '.$fullname.'

Thank you for Showing interest with us.

+

Please click the below button to verify your email.

+ + + '); + $emailsent=$this->email->send(); + + if($emailsent) + { + $this->session->set_userdata('suc','Registeration completed successfully.Kindly verify your mail to activate this account..!'); + redirect('home'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('home'); + } + } + function emailactivate($uid) + { + $table="users"; + $where=array("id"=>$uid); + $values=array( + 'status'=>1); + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','Your user account has been activated...!'); + redirect('home'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('home'); + } + } + function agentemailactivate($aid) + { + $table="users"; + $where=array("id"=>$aid); + $values=array( + 'status'=>1); + $result=$this->commonsql_model->updateTable($table,$where,$values); + $table="agents"; + $where=array("user_id"=>$aid); + $values=array( + 'status'=>1); + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','Your user account has been activated...!'); + redirect('home'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('home'); + } + } + function logincheck() + { + $username = $this->input->post('loginemail'); + $password = $this->input->post('loginpassword'); + $check_user=$this->Frontend_model->frontusercheck($username,$password); + //echo $this->db->last_query();exit; + if($check_user->num_rows()>0) + { + $ch = $check_user->row(); + $status=$ch->status; + if($status=="0") + { + $this->session->set_userdata('err','Please activate your account and login again..!'); + redirect('home'); + } + else + { + $this->session->set_userdata('primaryid',$ch->id); + $this->session->set_userdata('userrole',$ch->userrole); + $this->session->set_userdata('loggedname',$ch->name); + $this->session->set_userdata('loggedmobile',$ch->mobile); + $this->session->set_userdata('loggedpincode',$ch->pincode); + $this->session->set_userdata('loggeddob',""); + $this->session->set_userdata('loggedgender',""); + $this->session->set_userdata('loggedcarno',""); + $this->session->set_userdata('loggedbikeno',""); + $this->session->set_userdata('loggedcompanyno',""); + $this->session->set_userdata('loggedcountry',""); + $this->session->set_userdata('loggedleavingdate',""); + $this->session->set_userdata('loggedreturndate',""); + + + $this->session->set_userdata('suc','Successfully Logged in..!'); + redirect('front-dashboard'); + } + } + else + { + $this->session->set_userdata('err','The username or password you entered is incorrect.'); + redirect('home'); + } + } + function dashboard() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + + $this->load->view('front/ua-dashboard'); + } + function user_logout() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $session_data=array('primaryid'=>''); + $session_data=array('userrole'=>''); + $session_data=array('loggedname'=>''); + $this->session->unset_userdata($session_data); + $res=$this->session->sess_destroy(); + if($res) + { + $this->session->set_userdata('suc','Logged Out Successfully..!'); + redirect('home'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('home'); + } + + + } + function agent_logout() + { + $session_data=array('primaryid'=>''); + $session_data=array('userrole'=>''); + $session_data=array('loggedname'=>''); + $this->session->unset_userdata($session_data); + $this->session->sess_destroy(); + redirect('home'); + + } + function add_wish($uid,$pid) + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $table="wishlist"; + $values=array('user_id'=>$uid,//user + 'policy_id'=>$pid, + + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$values); + if($result) + { + $this->session->set_userdata('suc','Added to your wishlist...!'); + redirect('policy-detail/'.$pid); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('policy-detail/'.$pid); + } + } + function remove_wish($uid,$pid) + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $table="wishlist"; + $where=array("user_id"=>$uid,"policy_id"=>$pid); + $values=array( + 'status'=>0); + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','Removed from your wishlist...!'); + redirect('policy-detail/'.$pid); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('policy-detail/'.$pid); + } + } + function user_profile() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $this->load->view('front/user-profile'); + } + function user_editprofile() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + if($this->input->post('submit')) + { + $primaryid=$this->input->post('primaryid'); + $fullname=$this->input->post('fullname'); + $mobile=$this->input->post('mobile'); + $pincode=$this->input->post('pincode'); + $address=$this->input->post('address'); + $oldprofile=$this->input->post('oldprofile'); + $profiles=$this->input->post('profiles'); + $old_pass=$this->input->post('old_pass'); + $change_passwords=$this->input->post('change_passwords'); + $conform_passwords=$this->input->post('conform_passwords'); + if($change_passwords==""){ $pass=$old_pass; } + else{ $pass=md5($change_passwords); } + if($profiles=="") { + $simage=$oldprofile; + } + + + + if (!is_dir('uploads/userprofile')) { + mkdir('./uploads/userprofile', 0777, TRUE); + + } + + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/userprofile/'; // upload directory + + if($_FILES['profiles']) + { + + $img = $_FILES['profiles']['name']; + $tmp = $_FILES['profiles']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $simage = $path.strtolower($final_image); + if(move_uploaded_file($tmp,$simage)) + {}} } + $table="users"; + $where=array("id"=>$primaryid); + $values=array('name'=>$fullname, + 'mobile'=>$mobile, + 'pincode'=>$pincode, + 'address'=>$address, + 'profilepic'=>$simage, + 'password'=>$pass, + 'status'=>1); + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','Profile updated successfully...!'); + redirect('front-dashboard'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('front-dashboard'); + } + } + + } + + function favourites() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $this->load->view('front/user-favourites'); + } + function remocefavoyrite() + { + $wid=$_POST["wid"]; + $table="wishlist"; + $where=array("id"=>$wid); + $values=array( + + 'status'=>0); + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($result) + { + echo "1"; + + } + else + { + echo "2"; + } + } + function agent_profile() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $id=$this->session->userdata('primaryid'); + $data['age']=$this->Frontend_model->agent_detail($id); + $data['cmp']=$this->Company_model->list_cmp(); + $data['cat']=$this->Category_model->list_cat(); + $data['race']=$this->Frontend_model->agent_racetype(); + $this->load->view('front/agent-profile',$data); + } + function agent_edit_profile() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + if($this->input->post('submit')) + { + $oldprofile=$this->input->post('oldprofile'); + $profiles=$this->input->post('input6'); + $old_pass=$this->input->post('old_pass'); + $change_passwords=$this->input->post('change_passwords'); + $conform_passwords=$this->input->post('conform_passwords'); + if($change_passwords==""){ $pass=$old_pass; } + else{ $pass=md5($change_passwords); } + + if($profiles=="") { + $simage=$oldprofile; + } + $primaryid=$this->input->post('primaryid'); + $agent_code=$this->input->post('agent_code'); + $fullname=$this->input->post('fullname'); + $email=$this->input->post('email'); + $exper_number=$this->input->post('exper_number'); + $ex_period=$this->input->post('ex_period'); + $intro=$this->input->post('intro'); + $mobile=$this->input->post('mobile'); + $pincode=$this->input->post('pincode'); + $country=$this->input->post('country'); + $city=$this->input->post('city'); + $state=$this->input->post('state'); + $address=$this->input->post('address'); + $agent_cmp=$this->input->post('agent_cmp'); + $agent_cat=$this->input->post('agent_cat'); + $agent_lang=$this->input->post('agent_lang'); + $oldcategory=$this->input->post('oldcategory'); + $oldcompany=$this->input->post('oldcompany'); + $oldrace=$this->input->post('oldrace'); + $category_notify=$this->input->post('category_notify'); + $racetype_notify=$this->input->post('racetype_notify'); + $company_notify=$this->input->post('company_notify'); + $experience=$exper_number." ".$ex_period; + $lang =array(); + foreach($agent_lang as $key=>$val) + { + $lang[]=$agent_lang[$key]; + } + $lang_ress= implode(', ', $lang); + + $cat =array(); + foreach($agent_cat as $key=>$val) + { + $cat[]=$agent_cat[$key]; + } + $cat_ress= implode(', ', $cat); + //status 1 + + + $catstatus=$category_notify; + $racestatus=$racetype_notify; + $cmpstatus=$company_notify; + + $cat_res=$oldcategory; + $lang_res=$oldrace; + $agent_cmpp=$oldcompany; + if($category_notify!="1") + { $cat_res= $cat_ress; + if($cat_ress!=$oldcategory){ $catstatus="1"; } else { $catstatus="0"; } + } + if($racetype_notify!="1"){ + $lang_res= $lang_ress; + if($lang_ress!=$oldrace){ $racestatus="1"; } else { $racestatus="0"; } + } + if($company_notify!="1") + { + $agent_cmpp=$agent_cmp; + if($oldcompany!=$agent_cmp){ $cmpstatus="1"; } else{ $cmpstatus="0"; } + } + if (!is_dir('uploads/agentprofile')) { + mkdir('./uploads/agentprofile', 0777, TRUE); + + } + + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/agentprofile/'; // upload directory + + if($_FILES['input6']) + { + //echo "asdasd";exit; + $img = $_FILES['input6']['name']; + $tmp = $_FILES['input6']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "input6".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $simage = $path.strtolower($final_image); + if(move_uploaded_file($tmp,$simage)) + {}} } + $table="users"; + $where=array("id"=>$primaryid); + $values=array('name'=>$fullname, + 'mobile'=>$mobile, + 'pincode'=>$pincode, + 'country'=>$country, + 'state'=>$state, + 'city'=>$city, + 'address'=>$address, + 'profilepic'=>$simage, + 'password'=>$pass, + 'status'=>1); + $result=$this->commonsql_model->updateTable($table,$where,$values); + + $table="agents"; + $where=array("user_id"=>$primaryid); + $values=array('agent_code'=>$agent_code, + 'intro'=>$intro, + 'pincode'=>$pincode, + 'experience'=>$experience, + 'company'=>$agent_cmpp, + 'racetype'=>$lang_res, + 'category'=>$cat_res, + 'category_notify'=>$catstatus, + 'racetype_notify'=>$racestatus, + 'company_notify'=>$cmpstatus, + 'status'=>1); + $result=$this->commonsql_model->updateTable($table,$where,$values); + $result= $this->db->last_query(); + + if($result) + { + $this->session->set_userdata('suc','Profile updated successfully...!'); + redirect('agent-profile'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('agent-profile'); + } + } + $id=$this->session->userdata('primaryid'); + $data['age']=$this->Frontend_model->agent_detail($id); + $data['cmp']=$this->Company_model->list_cmp(); + $data['cat']=$this->Category_model->list_cat(); + $data['race']=$this->Frontend_model->agent_racetype(); + $this->load->view('front/agent-edit-profile',$data); + } + function agent_change_profile() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + + $this->load->view('front/agent-change-profile'); + } + function change_agent_profile() + { + $primaryid=$this->input->post('primaryid'); + if (!is_dir('uploads/agentprofile')) { + mkdir('./uploads/agentprofile', 0777, TRUE); + + } + + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/agentprofile/'; // upload directory + + if($_FILES['input6']) + { + + $img = $_FILES['input6']['name']; + $tmp = $_FILES['input6']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "input6".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $path = $path.strtolower($final_image); + + if(move_uploaded_file($tmp,$path)) + { + $table="users"; + $where=array("id"=>$primaryid); + $values=array( + 'profilepic'=>$path + ); + $result=$this->commonsql_model->updateTable($table,$where,$values); + } } } + if($result) + { + $this->session->set_userdata('suc','Profile picture updated successfully...!'); + redirect('agent-change-profile'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('agent-change-profile'); + } + } + function agent_change_password() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + if($this->input->post('submit')) + { + $primaryid=$this->input->post('primaryid'); + $old_pass=$this->input->post('old_pass'); + $change_passwords=$this->input->post('change_passwords'); + $conform_passwords=$this->input->post('conform_passwords'); + if($change_passwords==""){ $pass=$old_pass; } + else{ $pass=md5($change_passwords); } + $table="users"; + $where=array("id"=>$primaryid); + $values=array('password'=>$pass, + + 'status'=>1); + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','Password updated successfully...!'); + redirect('agent-change-password'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('agent-change-password'); + } + } + $this->load->view('front/agent-change-password'); + } + function agent_review() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $id=$this->session->userdata('primaryid'); + + $data['rev']=$this->Frontend_model->user_review_to_agent($id); + $this->load->view('front/agent-review',$data); + } + function policydetailenquiry() + { + + if($this->input->post('submit')) + { + $primaryid=$this->input->post('primaryid'); + $policyid=$this->input->post('policyid'); + $name=$this->input->post('name'); + $email=$this->input->post('email'); + $Pincode=$this->input->post('Pincode'); + $Mobile=$this->input->post('Mobile'); + $message=$this->input->post('message'); + if($primaryid==""){ + $table="users"; + $values=array('name'=>$name, + 'email'=>$email, + 'mobile'=>$Mobile, + 'pincode'=>$Pincode, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>0); + $result=$this->commonsql_model->insert_table($table,$values); + $userid=$this->db->insert_id(); + + $table="policy_detail_enquiry"; + + $values=array('userid'=>$userid, + 'policyid'=>$policyid, + 'name'=>$name, + 'email'=>$email, + 'pincode'=>$Pincode, + 'mobile'=>$Mobile, + 'message'=>$message, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$values); + + + } + else + { + $table="policy_detail_enquiry"; + $values=array('userid'=>$primaryid, + 'policyid'=>$policyid, + 'name'=>$name, + 'email'=>$email, + 'pincode'=>$Pincode, + 'mobile'=>$Mobile, + 'message'=>$message, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$values); + } + if($result) + { + $this->session->set_userdata('suc','Your enquiry details sent successfully. we will contact you soon...!'); + redirect('policy-detail/'.$policyid); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('policy-detail/'.$policyid); + } + } + } + function get_a_quote() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + + $loggeduserid=$_POST['priid']; + $policyid=$_POST['polid']; + $table="quotes"; + $values=array('user_id'=>$loggeduserid, + 'policy_id'=>$policyid, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>0); + $result=$this->commonsql_model->insert_table($table,$values); + if($result) + { + echo "1"; + + } + else + { + echo "2"; + } + } + function get_question_pop() + { + $cid=$_POST['catid']; + $data['primaryid']=$_POST['priid']; + $data['policyid']=$_POST['polid']; + $data['pincode']=$_POST['pin']; + $data['company']=$_POST['company']; + $data['getquest']=$this->Frontend_model->get_category_questions($cid); + //questionpop + $this->load->view('front/category_wise_question',$data); + } + function insert_question_category() + { + + parse_str($_POST["ser"], $ser_data); + $hide_answer=$ser_data["hide_answer"]; + $hide_question=$ser_data["hide_question"]; + $userid=$ser_data["userid"]; + $pincode=$ser_data["pincode"]; + $policyid=$ser_data["policyid"]; + $company=$ser_data["company"]; + + + + + $table="quotes"; + $values=array('user_id'=>$userid, + 'policy_id'=>$policyid, + + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>0); + $result=$this->commonsql_model->insert_table($table,$values); + + $quoe=$this->db->insert_id(); + + foreach($hide_question as $key=>$val){ + + + + + $hd_anss= $hide_answer[$key]; + + + $table="quote_questions"; + $values=array('quote_id'=>$quoe, + 'question'=>$hide_question[$key], + 'answer'=>$hd_anss, + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$values); + + } + $getingquote=$this->Frontend_model->select_pincode_agentcount($pincode,$agentcount=3,$company); + + foreach($getingquote->result() as $gq){ + + $name=$gq->name; + $profilepic=$gq->profilepic; + $email=$gq->email; + $mobile=$gq->mobile; + $company=$gq->company; + $experience=$gq->experience; + $getcmpname=$this->Frontend_model->get_company_name($company); + + if($getcmpname->num_rows()>0){ + $cm=$getcmpname->row(); + $companyname=$cm->name; + } + ?> +
+ +
+ session->userdata('primaryid')==""){ redirect('home'); } + $data['age_req']=$this->Frontend_model->show_quote_to_agent(); + + $this->load->view('front/agent-request',$data); + } + function respondtouser() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + if($this->input->post('submit')) + { + $qid=$this->input->post('qid'); + $uid=$this->input->post('user'); + $agid=$this->input->post('agid'); + $cMessage=$this->input->post('cMessage'); + $cEmail=$this->input->post('cEmail'); + $cMobile=$this->input->post('cMobile'); + + + $table="quote_response"; + $values=array('agency_id'=>$agid, + 'user_id'=>$uid, + 'quote_id'=>$qid, + 'mobile'=>$cMobile, + 'email'=>$cEmail, + 'message'=>$cMessage, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>0); + $result=$this->commonsql_model->insert_table($table,$values); + + if($result) + { + $this->session->set_userdata('suc','Your response sent to the user successfully...!'); + redirect('agent-request'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('agent-request'); + } + } + } + function user_request() + { + + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $id=$this->session->userdata('primaryid'); + $data['user_req']=$this->Frontend_model->show_quote_to_user($id); + $this->load->view('front/user-request',$data); + } + function user_request_cancel($qid) + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + + $where=array("id"=>$qid); + $table="quotes"; + $values=array( + 'status'=>3); + $result=$this->commonsql_model->updateTable($table,$where,$values); + $where=array("quote_id"=>$qid); + $table="quote_response"; + $values=array( + 'status'=>3); //cancelled + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','Your quote cancelled successfully...!'); + redirect('user-request'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('user-request'); + } + } + function view_user_response($quoteid) + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $id=$this->session->userdata('primaryid'); + $data['user_req']=$this->Frontend_model->show_response_detail_to_user($id,$quoteid); + $this->load->view('front/user-response-view',$data); + } + function writereview() + { + + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $uid=$this->input->post('user'); + $agid=$this->input->post('agid'); + $rating=$this->input->post('rating'); + $cMessage=$this->input->post('cMessage'); + $policyid=$this->input->post('policyid'); + + + + $table="reviews"; + $values=array('user_id'=>$uid, + 'agency_id'=>$agid, + 'rating'=>$rating, + 'text'=>$cMessage, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>0); + $result=$this->commonsql_model->insert_table($table,$values); + + if($result) + { + $this->session->set_userdata('suc','Your review updated successfully...!'); + redirect('policy-detail/'.$policyid); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('policy-detail/'.$policyid); + } + } + function user_reply_to_quote($aid,$uid,$qid,$val) + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + if($val=="1"){ $ms="Accepted"; + $table="quotes";$where=array("id"=>$qid); + $values=array( 'status'=>1, + 'agency_id'=>$aid); + $result=$this->commonsql_model->updateTable($table,$where,$values); + + } + else { $ms="Cancelled"; }//status 7->user not interested + $where=array("agency_id"=>$aid,"user_id"=>$uid,"quote_id"=>$qid); + $table="quote_response"; + $values=array( + 'status'=>$val); + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','Quote '.$ms.'..!!!'); + redirect('user-request'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('user-request'); + } + } + function agent_order() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $aid=$this->session->userdata('primaryid'); + $data['age_ord']=$this->Frontend_model->show_response_to_agent_for_accept($aid); + $this->load->view('front/agent-order',$data); + } + function agentacceptorder($qid) + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + + $table="quotes";$where=array("id"=>$qid); + $values=array( + 'status'=>1); + $result=$this->commonsql_model->updateTable($table,$where,$values); + + + if($result) + { + $this->session->set_userdata('suc','Quote Accepted..!!!'); + redirect('agent-order'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('agent-order'); + } + } + function agentcompleteorder($qid) + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + + $table="quotes";$where=array("id"=>$qid); + $values=array( + 'status'=>2); + $result=$this->commonsql_model->updateTable($table,$where,$values); + + + if($result) + { + $this->session->set_userdata('suc','Quote Accepted..!!!'); + redirect('agent-order'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('agent-order'); + } + } + function user_order() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $uid=$this->session->userdata('primaryid'); + $data['user_ord']=$this->Frontend_model->show_response_to_user_for_accept_complete($uid); + $this->load->view('front/user-order',$data); + } + function cancelorderofagent($qid) + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + + $table="quotes";$where=array("id"=>$qid); + $values=array( + 'status'=>3); + $result=$this->commonsql_model->updateTable($table,$where,$values); + + + if($result) + { + $this->session->set_userdata('suc','Quote Accepted..!!!'); + redirect('user-order'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('user-order'); + } + } + function approvereview($id,$val) + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + + $table="reviews";$where=array("id"=>$id); + $values=array( + 'status'=>$val); + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($val=="1"){ $ms="Approved"; } + + else { $ms="Not Approved"; } + + if($result) + { + $this->session->set_userdata('suc','Review '.$ms.'...!!!'); + redirect('agent-review'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('agent-review'); + } + } + function user_review() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $id=$this->session->userdata('primaryid'); + + $data['rev']=$this->Frontend_model->agent_approve_review_to_user($id); + $this->load->view('front/user-review',$data); + } + function showpopupforreview() + { + if($this->session->userdata('primaryid')==""){ redirect('home'); } + $agentid= $_POST['agentid']; + $data['revw']=$this->Frontend_model->agent_review_from_user($agentid); + // echo $this->db->last_query();exit; + $this->load->view('front/review-popup',$data); + } + function category_view_price($cid) + { + if($cid=="1") + { + $lifepincode=$this->input->post("lifepincode"); + $lifename=$this->input->post("lifename"); + $lifedob=$this->input->post("lifedob"); + $lifemobile=$this->input->post("lifemobile"); + $life_age=$this->input->post("lifeage"); + $data['lfgetpoltop']=$this->Frontend_model->get_categorywise_policy_with_agelimit_top($cid,$life_age);//top + $data['lfgetpol']=$this->Frontend_model->get_categorywise_policy_with_agelimit($cid,$life_age);//more + //echo $this->db->last_query();exit; + $data['lfgetcat']=$this->Frontend_model->get_categorydetails_for_categoryview($cid); + $data['lifepincode']=$lifepincode; + $data['lifename']=$lifename; + $data['lifedob']=$lifedob; + $data['lifemobile']=$lifemobile; + $data['life_age']=$life_age; + $data['mobexist']=$this->Frontend_model->check_mobile_exist_for_login_register($lifemobile); + $this->session->set_userdata('loggeddob',$lifedob); + + + } + if($cid=="2") + { + $healthpincode=$this->input->post("healthpincode"); + $healthname=$this->input->post("healthname"); + $healthgender=$this->input->post("healthradio"); + $healthmobile=$this->input->post("healthmobile"); + $data['lifepincode']=$healthpincode; + $data['healthname']=$healthname; + $data['healthgender']=$healthgender; + $data['healthmobile']=$healthmobile; + $data['lfgetpoltop']=$this->Frontend_model->get_categorywise_policy_with_agelimit_top($cid);//top + $data['lfgetpol']=$this->Frontend_model->get_categorywise_policy_with_agelimit($cid);//more + + $data['lfgetcat']=$this->Frontend_model->get_categorydetails_for_categoryview($cid); + $data['mobexist']=$this->Frontend_model->check_mobile_exist_for_login_register($healthmobile); + $this->session->set_userdata('loggedgender',$healthgender); + } + if($cid=="3") + { + $carpincode=$this->input->post("carpincode"); + + $carregister=$this->input->post("carregister"); + $carmobile=$this->input->post("carmobile"); + $data['carpincode']=$carpincode; + + $data['carregister']=$carregister; + $data['carmobile']=$carmobile; + $data['lfgetpoltop']=$this->Frontend_model->get_categorywise_policy_with_agelimit_top($cid);//top + $data['lfgetpol']=$this->Frontend_model->get_categorywise_policy_with_agelimit($cid);//more + + $data['lfgetcat']=$this->Frontend_model->get_categorydetails_for_categoryview($cid); + + $data['mobexist']=$this->Frontend_model->check_mobile_exist_for_login_register($carmobile); + $this->session->set_userdata('loggedcarno',$carregister); + } + if($cid=="4") + { + $bikepincode=$this->input->post("bikepincode"); + $bikeregister=$this->input->post("bikeregister"); + $bikemobile=$this->input->post("bikemobile"); + $data['bikepincode']=$bikepincode; + + $data['bikeregister']=$bikeregister; + $data['bikemobile']=$bikemobile; + $data['lfgetpoltop']=$this->Frontend_model->get_categorywise_policy_with_agelimit_top($cid);//top + $data['lfgetpol']=$this->Frontend_model->get_categorywise_policy_with_agelimit($cid);//more + $data['lfgetcat']=$this->Frontend_model->get_categorydetails_for_categoryview($cid); + $data['mobexist']=$this->Frontend_model->check_mobile_exist_for_login_register($bikemobile); + $this->session->set_userdata('loggedbikeno',$bikeregister); + } + if($cid=="5") + { + $smepincode=$this->input->post("smepincode"); + $smeregister=$this->input->post("smeregister"); + $smemobile=$this->input->post("smemobile"); + $data['smepincode']=$smepincode; + + $data['smeregister']=$smeregister; + $data['smemobile']=$smemobile; + $data['lfgetpoltop']=$this->Frontend_model->get_categorywise_policy_with_agelimit_top($cid);//top + $data['lfgetpol']=$this->Frontend_model->get_categorywise_policy_with_agelimit($cid);//more + $data['lfgetcat']=$this->Frontend_model->get_categorydetails_for_categoryview($cid); + $data['mobexist']=$this->Frontend_model->check_mobile_exist_for_login_register($smemobile); + $this->session->set_userdata('loggedcompanyno',$smeregister); + } + if($cid=="6") + { + $country=$this->input->post("country"); + $Leaving=$this->input->post("Leaving"); + $Return=$this->input->post("Return"); + $data['Leaving']=$Leaving; + + $data['Return']=$Return; + $data['country']=$country; + + $data['lfgetpoltop']=$this->Frontend_model->get_categorywise_policy_with_agelimit_top($cid);//top + $data['lfgetpol']=$this->Frontend_model->get_categorywise_policy_with_agelimit($cid);//more + $data['lfgetcat']=$this->Frontend_model->get_categorydetails_for_categoryview($cid); + //echo $this->db->last_query();exit; + $this->session->set_userdata('loggedcountry',$country); + $this->session->set_userdata('loggedleavingdate',$Leaving); + $this->session->set_userdata('loggedreturndate',$Return); + } + $this->load->view('front/category_viewprice',$data); + } + function getplantocompare() + { + $pid=$_POST["pid"]; + $plan=$_POST["plan"]; + $data['complan']=$this->Frontend_model->get_policy_compare($pid,$plan);//top + + $this->load->view('front/category_compare_plan',$data); + } + function compare_plan_details($cat) + { + if($this->input->post("submitcompare")) + { + $selectedpaln=$this->input->post("selectedplans"); + $str_arr = explode (",", $selectedpaln); + + $data['compared']=$this->Frontend_model->get_comparisions($cat,$str_arr);//top + // echo $this->db->last_query(); + $data['compared_mas']=$this->Frontend_model->get_comparisions_master($cat,$str_arr);//top + $data['cate']=$cat;//top + } + + + $this->load->view('front/category_compare_details',$data); + } + function view_agent_profile($aid,$qid) + { + $data['agede']=$this->Frontend_model->agent_detail($aid);//top + //echo $this->db->last_query();exit; + $data['prev_qid']=$qid; + $this->load->view('front/view_agent_to_user',$data); + } + function agent_collect_documents($qid,$cid) + { + if($this->input->post('doc_submit')) + { + + $document=$this->input->post('documentss'); print_r($document); + $user_id=$this->input->post('user_id'); + $policy_id=$this->input->post('policy_id'); + $agency_id=$this->input->post('agency_id'); + foreach($document as $key=>$val) + { + + if (!is_dir('uploads/document_collect')) { + mkdir('./uploads/document_collect', 0777, TRUE); + } + if($_FILES['file']['tmp_name']) + { + $temp_vehicle_doc=$_FILES['file']['tmp_name'][$key]; + $business_doc=str_replace(' ', '_', $_FILES["file"]["name"][$key]); + $extension1 = pathinfo($business_doc, PATHINFO_EXTENSION); + $business_document=date('ymdhis').'.'.$business_doc; + $documents='uploads/document_collect/'.$business_document; + + $targetPath = './uploads/document_collect/'; + $targetFile=$targetPath.$business_document; + + + if(move_uploaded_file($temp_vehicle_doc, $targetFile)) + { } + } + $table="collected_documents_from_customer"; + $values=array('document_id'=>$document[$key], + 'doc_copy'=>$documents, + 'quote'=>$qid, + 'category'=>$cid, + 'policy'=>$policy_id, + 'user'=>$user_id, + 'agent'=>$agency_id, + 'status'=>1); + if($document[$key]!=" " && $documents!=" "){ + $result=$this->commonsql_model->insert_table($table,$values); + } + + } + $table="quotes";$where=array("id"=>$qid); + $values=array( + 'status'=>4); //document collect + $result=$this->commonsql_model->updateTable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','Documents Submitted ...!!!'); + redirect('agent-request'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('agent-request'); + } + } + $data['doc_coll']=$this->Frontend_model->get_documents_collection($cid);//top + $data['quote_user']=$this->Frontend_model->get_details_of_quote_user($qid);//top + $data['prev_qid']=$qid; + $data['cat_qid']=$cid; + $this->load->view('front/agent-document-collect',$data); + } + function change_document_status($qid,$val,$agid) + { + $table="quotes";$where=array("id"=>$qid); + $values=array('status'=>$val); //verify + $result=$this->commonsql_model->updateTable($table,$where,$values); + + if($val=="2")//2-completed in quotes so same as quotes response + { + $table="quote_response";$where=array("quote_id"=>$qid,"agency_id"=>$agid); + $values=array('status'=>$val); //verify + $result=$this->commonsql_model->updateTable($table,$where,$values); + } + if($result) + { + $this->session->set_userdata('suc','Your policy submitted ...!!!'); + redirect('agent-request'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('agent-request'); + } + } + function get_current_policy_detail() + { + $cid=$_POST['idd']; + $get_pol=$this->Frontend_model->get_current_policy_detail($cid); + if($get_pol->num_rows()>0){$p=$get_pol->row();$categoryname=$p->catname;}else {$categoryname="";}; + ?> +

+
num_rows()>0){ + foreach($get_pol->result() as $gp){ + $polid=$gp->id; + $logo=$gp->logo; + $policyname=$gp->name; + $intro=$gp->intro; + $short_des = substr($intro, 0, 50); + ?> +
+ Image +

+

+
+ +

No related polices

\ No newline at end of file diff --git a/application/controllers/Lists.php b/application/controllers/Lists.php new file mode 100644 index 0000000..e2b3d7e --- /dev/null +++ b/application/controllers/Lists.php @@ -0,0 +1,36 @@ +load->model('Lists_model'); + + + } + function list_enquiries() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['enq']=$this->Lists_model->list_enquiry(); + $this->load->view('admin/list/enquire_list',$data); + } + function get_enquire() + { + $id=$_POST['id']; + + $tblname="contact"; + $where=array('id'=>$id);$show=('message'); + $results=$this->commonsql_model->selectTable($tblname,$where,$show); + $data['res']=$results; + $this->load->view('admin/list/enquire_more',$data); + } + function list_reviews() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['rev']=$this->Lists_model->list_review(); + $this->load->view('admin/list/review_list',$data); + } + +} +?> \ No newline at end of file diff --git a/application/controllers/Menu.php b/application/controllers/Menu.php new file mode 100644 index 0000000..717a22a --- /dev/null +++ b/application/controllers/Menu.php @@ -0,0 +1,52 @@ +load->model('Menu_model'); + + + } + function list_menu() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['men']=$this->Menu_model->list_menu(); + $this->load->view('admin/menu/list',$data); + } + function update_menu() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('add')) + { + $checkhide=$this->input->post('checkhide'); + $pri_id=$this->input->post('pri_id'); + + foreach($pri_id as $key=>$val) + { + $PID=$pri_id[$key]; + $VAL=$checkhide[$key]; + $table="menu"; + $where=array("id"=>$PID); + $rvalue=array("status"=>$VAL); + $result=$this->commonsql_model->updateTable($table,$where,$rvalue); + } + if($result) + { + $this->session->set_userdata('suc','successfully Updated'); + redirect('admin/cmenu'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/cmenu'); + } + } + + } + + +} +?> \ No newline at end of file diff --git a/application/controllers/Orders.php b/application/controllers/Orders.php new file mode 100644 index 0000000..358e1be --- /dev/null +++ b/application/controllers/Orders.php @@ -0,0 +1,22 @@ +load->model('Orders_model'); + + + } + function list_orders() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['ord']=$this->Orders_model->show_quote_of_all(); + $this->load->view('admin/orders/list',$data); + } + + + +} +?> \ No newline at end of file diff --git a/application/controllers/Policy.php b/application/controllers/Policy.php new file mode 100644 index 0000000..d2c33e4 --- /dev/null +++ b/application/controllers/Policy.php @@ -0,0 +1,332 @@ +load->model('Policy_model'); + $this->load->model('Company_model'); + $this->load->model('Category_model'); + } + function list_policy() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['pol']=$this->Policy_model->list_policies(); + $this->load->view('admin/policy/list',$data); + } + function add_policy() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('add')) + { + $policyname=$this->input->post('policyname'); + $Company=$this->input->post('Company'); + $Category=$this->input->post('Category'); + $p_amount=$this->input->post('p_amount'); + $pa_period=$this->input->post('pa_period'); + $p_period=$this->input->post('p_period'); + $pp_period=$this->input->post('pp_period'); + $guarantee=$this->input->post('guarantee'); + $g_period=$this->input->post('g_period'); + $Intro=$this->input->post('Intro'); + $topplan=$this->input->post('topplan'); + $claimsettleper=$this->input->post('claimsettleper'); + $lifecover=$this->input->post('lifecover'); + $am_type=$this->input->post('am_type'); + $Compare=$this->input->post('Compare'); + $cmp_detail=$this->input->post('cmp_detail'); + $maxager=$this->input->post('maxager'); + + //multi + $benefits=$this->input->post('benefits'); + $Specialization=$this->input->post('Specialization'); + $array_benefits = implode(",", $benefits); + $ben =array(); + foreach($benefits as $key=>$val) + { + $ben[]=$benefits[$key]; + } + $ben_res= implode(', ', $ben); + + $spec =array(); + foreach($Specialization as $key1=>$val1) + { + $spec[]=$Specialization[$key1]; + } + $spec_res= implode(', ', $spec); + //make directory + + if (!is_dir('uploads/policy')) { + mkdir('./uploads/policy', 0777, TRUE); + + } + + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/policy/'; // upload directory + + if($_FILES['Image']) + { + + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $path = $path.strtolower($final_image); + + if(move_uploaded_file($tmp,$path)) + {} } } + $table="policies"; + $rvalue=array( + 'name'=>$policyname, + 'category'=>$Category, + 'company'=>$Company, + 'amount'=>$p_amount, + 'amount_period'=>$pa_period, + 'image'=>$path, + 'intro'=>$Intro, + 'max_cover_age'=>$maxager, + 'benefits'=>$ben_res, + 'life_cover'=>$lifecover." ".$am_type, + 'claimed_settlement'=>$claimsettleper, + 'is_this_top_plan'=>$topplan, + 'specializations'=>$spec_res, + 'guarantee'=>$guarantee." ".$g_period, + 'policy_period'=>$p_period." ".$pp_period, + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$rvalue); + $polid=$this->db->insert_id(); + + foreach($Compare as $ck=>$cv){ + $table="policy_compare_details"; + $rvalue=array( + 'policy'=>$polid, + 'category'=>$Category, + 'compare'=>$Compare[$ck], + 'comparedetail'=>$cmp_detail[$ck], + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>1); + if($cmp_detail[$ck]!=""){ + $result=$this->commonsql_model->insert_table($table,$rvalue); + } + } + if($result) + { + $this->session->set_userdata('suc','successfully added'); + redirect('admin/policies'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/policies'); + } + + } + + $data['cmp']=$this->Company_model->list_cmp(); + $data['cat']=$this->Category_model->list_cat(); + + $this->load->view('admin/policy/add',$data); + } + function get_compare_master() + { + $cid=$_POST['val']; + $com=$this->Policy_model->get_compare_master($cid); + foreach($com->result() as $c){ + $comid=$c->id; + $compare_name=$c->compare_name;?> + + session->userdata('id')==""){redirect('admin/login');} + $data['pol']=$this->Policy_model->list_policies($id); + $data['cmp_det']=$this->Policy_model->get_polict_compare_details($id); + $this->load->view('admin/policy/view',$data); + } + function edit_policy($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('edit')) + { + $policyname=$this->input->post('policyname'); + $Company=$this->input->post('Company'); + $Category=$this->input->post('Category'); + $p_amount=$this->input->post('p_amount'); + $pa_period=$this->input->post('pa_period'); + $p_period=$this->input->post('p_period'); + $pp_period=$this->input->post('pp_period'); + $guarantee=$this->input->post('guarantee'); + $g_period=$this->input->post('g_period'); + $Intro=$this->input->post('Intro'); + $Image=$this->input->post('Image'); + $oldimage=$this->input->post('oldimage'); + $topplan=$this->input->post('topplan'); + $claimsettleper=$this->input->post('claimsettleper'); + $lifecover=$this->input->post('lifecover'); + $am_type=$this->input->post('am_type'); + $Compare=$this->input->post('Compare'); + $cmp_detail=$this->input->post('cmp_detail'); + $maxager=$this->input->post('maxager'); + $hiddenprimary=$this->input->post('hiddenprimary'); + //multi + $benefits=$this->input->post('benefits'); + $Specialization=$this->input->post('Specialization'); + $array_benefits = implode(",", $benefits); + $ben =array(); + foreach($benefits as $key=>$val) + { + $ben[]=$benefits[$key]; + } + $ben_res= implode(', ', $ben); + + $spec =array(); + foreach($Specialization as $key1=>$val1) + { + $spec[]=$Specialization[$key1]; + } + $spec_res= implode(', ', $spec); + + if($Image=="") { + $simage=$oldimage; + } + if (!is_dir('uploads/policy')) { + mkdir('./uploads/policy', 0777, TRUE); + + } + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/policy/'; // upload directory + + if($_FILES['Image']['tmp_name']) + { + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $simage = $path.strtolower($final_image); + if(move_uploaded_file($tmp,$simage)) + {}} } + $table="policies"; + $where=array("id"=>$id); + $rvalue=array( + 'name'=>$policyname, + 'category'=>$Category, + 'company'=>$Company, + 'amount'=>$p_amount, + 'amount_period'=>$pa_period, + 'image'=>$simage, + 'intro'=>$Intro, + 'benefits'=>$ben_res, + 'max_cover_age'=>$maxager, + 'life_cover'=>$lifecover." ".$am_type, + 'claimed_settlement'=>$claimsettleper, + 'is_this_top_plan'=>$topplan, + 'specializations'=>$spec_res, + 'guarantee'=>$guarantee." ".$g_period, + 'policy_period'=>$p_period." ".$pp_period, + 'udate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $result=$this->commonsql_model->updateTable($table,$where,$rvalue); + + + foreach($Compare as $ck=>$cv){ + /* comparision edit */ + $exist_tag=$this->Policy_model->get_polict_compare_details($id); + + if($exist_tag->num_rows()>0) + { + $oldcompare=array(); + + foreach($exist_tag->result() as $list) + { + $oldcompare[]=$list->id ; + + } + } + //different1 + $diff=array_diff($oldcompare,$hiddenprimary); + if($diff>0){ + foreach($diff as $value){ + $where=array('id'=>$value); + $tablename="policy_compare_details"; + $values=array('status'=>0); + if($hiddenprimary[$ck]!=""){ + $product=$this->commonsql_model->updateTable($tablename,$where,$values); + } + } + } + $table="policy_compare_details"; + $rvalue=array( + 'policy'=>$id, + 'category'=>$Category, + 'compare'=>$Compare[$ck], + 'comparedetail'=>$cmp_detail[$ck], + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>1); + if($hiddenprimary[$ck]==""){ + if($cmp_detail[$ck]!=""){ + $result=$this->commonsql_model->insert_table($table,$rvalue); + } + } + if($hiddenprimary[$ck]!="") + { + $where=array("id"=>$hiddenprimary[$ck]); + $result=$this->commonsql_model->updateTable($table,$where,$rvalue); + } + + } + if($result) + { + $this->session->set_userdata('suc','successfully updated'); + redirect('admin/policies'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/policies'); + } + + + } + $data['pol']=$this->Policy_model->list_policies($id); + $data['cmp_det']=$this->Policy_model->get_polict_compare_details($id); + $data['cmp']=$this->Company_model->list_cmp(); + $data['cat']=$this->Category_model->list_cat(); + $this->load->view('admin/policy/edit',$data); + } + function delete_policy($id) + { + $table="policies"; + $where=array("id"=>$id); + $rvalue=array( + 'status'=>0); + $result=$this->commonsql_model->updateTable($table,$where,$rvalue); + if($result) + { + $this->session->set_userdata('suc','successfully deleted'); + redirect('admin/policies'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/policies'); + } + } + +} +?> \ No newline at end of file diff --git a/application/controllers/Role.php b/application/controllers/Role.php new file mode 100644 index 0000000..b63564f --- /dev/null +++ b/application/controllers/Role.php @@ -0,0 +1,112 @@ +load->model('Role_model'); + } + function list_role() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['role']=$this->Role_model->list_roles(); + $this->load->view('admin/role/list',$data); + } + function add_role() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('role')) + { + $name=$this->input->post('rolename'); + $table="staff_roles"; + //echo $ledgername; + $values=array('name'=>$name, + 'cdate'=>date('Y-m-d H:i:s'), + 'cby'=>$this->session->userdata('id'), + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$values); + if($result) + { + $this->session->set_userdata('suc','successfully added'); + redirect('admin/role'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/role'); + } + + } + } + function roleaction() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + + $type=$_POST['type']; //types like view, edit etc., + $id=$_POST['id']; + + //selecting table + $tableName="staff_roles"; + $select=array('id','name'); + $where=array('id'=>$id); + $data['role']=$this->commonsql_model->selectTable($tableName,$where,$select); + $data['type']=$type; + $this->load->view('admin/role/roleaction',$data); + + + } + function edit_role($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('roleupdate')) + { + $name=$this->input->post('rolename'); + $table="staff_roles"; + //echo $ledgername; + $values=array('name'=>$name, + 'udate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $where=array("id"=>$id); + $result=$this->commonsql_model->updatetable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','successfully updated'); + redirect('admin/role'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/role'); + } + } + } + function delete_role($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('roleupdate')) + { + + $table="staff_roles"; + //echo $ledgername; + $values=array( + 'status'=>0); + $where=array("id"=>$id); + $result=$this->commonsql_model->updatetable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','successfully deleted'); + redirect('admin/role'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/role'); + } + } + } +} +?> \ No newline at end of file diff --git a/application/controllers/Slider.php b/application/controllers/Slider.php new file mode 100644 index 0000000..c9e8595 --- /dev/null +++ b/application/controllers/Slider.php @@ -0,0 +1,158 @@ +load->model('Slider_model'); + + + } + function list_slider() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['slider']=$this->Slider_model->list_sliders(); + $this->load->view('admin/slider/list',$data); + } + function add_slider() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post("addslider")) + { + $Title=$this->input->post("Title"); + $Subtitle=$this->input->post("Subtitle"); + //make directory + + if (!is_dir('uploads/slider')) { + mkdir('./uploads/slider', 0777, TRUE); + + } + + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/slider/'; // upload directory + + if($_FILES['Image']) + { + + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $path = $path.strtolower($final_image); + + if(move_uploaded_file($tmp,$path)) + { + $table="slider"; + $rvalue=array( + 'title'=>$Title, + 'subtitle'=>$Subtitle, + 'image'=>$path, + 'cdate'=>date('Y-m-d H:i:s'), + 'cby'=>$this->session->userdata('id'), + 'status'=>1); + if($Title!="" && $Subtitle!="" && $path!="") { + $result=$this->commonsql_model->insert_table($table,$rvalue); + } + + } } } + if($result) + { + $this->session->set_userdata('suc','successfully added'); + redirect('admin/slider'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/slider'); + } + + + } + $this->load->view('admin/slider/add'); + } + function edit_slider($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post("editslider")) + { + $Title=$this->input->post("Title"); + $Subtitle=$this->input->post("Subtitle"); + $oldimage=$this->input->post("old_image"); + $image=$this->input->post("Image"); + if($Image=="") { + $simage=$oldimage; + } + if (!is_dir('uploads/slider')) { + mkdir('./uploads/slider', 0777, TRUE); + + } + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/slider/'; // upload directory + + if($_FILES['Image']['tmp_name']) + { + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $simage = $path.strtolower($final_image); + if(move_uploaded_file($tmp,$simage)) + {}} } + $tblname="slider"; + $wheredata=(array('id'=>$id)); + $values=array( + 'title'=>$Title, + 'subtitle'=>$Subtitle, + 'image'=>$simage, + 'udate'=>date('Y-m-d H:i:s'), + + ); + $result=$this->commonsql_model->updateTable($tblname,$wheredata,$values); + if($result) + { + $this->session->set_userdata('suc','successfully Updated'); + redirect('admin/slider'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/slider'); + } + + + } + $data['slider']=$this->Slider_model->list_sliders($id); + $this->load->view('admin/slider/edit',$data); + } + function check_uncheck_slider() + { + $id=$_POST['id']; + $value=$_POST['val']; + $tblname="slider"; + $where=array('id'=>$id); + $update=array('status'=>$value); + $results=$this->commonsql_model->updateTable($tblname,$where,$update); + if($results) + { + echo "1"; + } + else + { + echo "2"; + } + } +} +?> \ No newline at end of file diff --git a/application/controllers/Staff.php b/application/controllers/Staff.php new file mode 100644 index 0000000..ea25f62 --- /dev/null +++ b/application/controllers/Staff.php @@ -0,0 +1,126 @@ +load->model('Staff_model'); + $this->load->model('Role_model'); + } + function list_staff() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['staff']=$this->Staff_model->list_staffs(); + $this->load->view('admin/staff/list',$data); + } + function add_staff() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('addstaff')) + { + $name=$this->input->post('Name'); + $Role=$this->input->post('Role'); + $Mobile=$this->input->post('Mobile'); + $Email=$this->input->post('Email'); + $loginvalue=$this->input->post('loginvalue'); + $username=$this->input->post('username'); + $password=$this->input->post('password'); + $table="staff"; + //echo $ledgername; + $values=array('role'=>$Role, + 'name'=>$name, + 'email'=>$Email, + 'mobile'=>$Mobile, + 'username'=>$username, + 'password'=>md5($password), + 'cdate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $result=$this->commonsql_model->insert_table($table,$values); + if($result) + { + $this->session->set_userdata('suc','successfully added'); + redirect('admin/staff'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/staff'); + } + + } + $data['role']=$this->Role_model->list_roles(); + $this->load->view('admin/staff/add',$data); + } + + function edit_staff($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('addstaff')) + { + $name=$this->input->post('Name'); + $Role=$this->input->post('Role'); + $Mobile=$this->input->post('Mobile'); + $Email=$this->input->post('Email'); + $loginvalue=$this->input->post('loginvalue'); + $username=$this->input->post('username'); + $password=$this->input->post('password'); + $old_pass=$this->input->post('old_pass'); + if($password==""){ $curr_pass=$old_pass; } + else { $curr_pass=md5($password); } + $table="staff"; + //echo $ledgername; + $values=array('role'=>$Role, + 'name'=>$name, + 'email'=>$Email, + 'mobile'=>$Mobile, + 'username'=>$username, + 'password'=>$curr_pass, + 'udate'=>date('Y-m-d H:i:s'), + 'status'=>1); + $where=array("id"=>$id); + $result=$this->commonsql_model->updatetable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','successfully updated'); + redirect('admin/staff'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/staff'); + } + } + $data['role']=$this->Role_model->list_roles(); + $data['staff']=$this->Staff_model->list_staffs($id); + $this->load->view('admin/staff/edit',$data); + } + function delete_staff($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('yes')) + { + + $table="staff"; + //echo $ledgername; + $values=array( + 'status'=>0); + $where=array("id"=>$id); + $result=$this->commonsql_model->updatetable($table,$where,$values); + if($result) + { + $this->session->set_userdata('suc','successfully deleted'); + redirect('admin/staff'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/staff'); + } + } + } +} +?> \ No newline at end of file diff --git a/application/controllers/Testimonial.php b/application/controllers/Testimonial.php new file mode 100644 index 0000000..053ad16 --- /dev/null +++ b/application/controllers/Testimonial.php @@ -0,0 +1,169 @@ +load->model('Testimonial_model'); + + + } + function list_testimonial() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['tes']=$this->Testimonial_model->list_testimonial(); + $this->load->view('admin/testimonial/list',$data); + } + function add_testimonial() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post("add")) + { + $Title=$this->input->post("Title"); + + $Detail=$this->input->post("Detail"); + $tg =array(); + foreach($tags as $key1=>$val1) + { + $tg[]=$tags[$key1]; + } + $tg_res= implode(', ', $tg); + //make directory + + if (!is_dir('uploads/testimonial')) { + mkdir('./uploads/testimonial', 0777, TRUE); + + } + + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/testimonial/'; // upload directory + + if($_FILES['Image']) + { + + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $path = $path.strtolower($final_image); + + if(move_uploaded_file($tmp,$path)) + { + $table="testimonial"; + $rvalue=array( + 'name'=>$Title, + 'message'=>$Detail, + 'image'=>$path, + + 'cdate'=>date('Y-m-d H:i:s'), + + 'status'=>1); + + $result=$this->commonsql_model->insert_table($table,$rvalue); + + + } } } + if($result) + { + $this->session->set_userdata('suc','successfully added'); + redirect('admin/testimonial'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/testimonial'); + } + + + } + $this->load->view('admin/testimonial/add'); + } + function edit_testimonial($id) + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post("edit")) + { + $Title=$this->input->post("Title"); + + $Detail=$this->input->post("Detail"); + $oldimage=$this->input->post("old_image"); + $Image=$this->input->post("Image"); + + if($Image=="") { + $simage=$oldimage; + } + if (!is_dir('uploads/testimonial')) { + mkdir('./uploads/testimonial', 0777, TRUE); + + } + $valid_extensions = array('jpeg', 'jpg', 'png'); // valid extensions + $path = 'uploads/testimonial/'; // upload directory + + if($_FILES['Image']['tmp_name']) + { + $img = $_FILES['Image']['name']; + $tmp = $_FILES['Image']['tmp_name']; + // get uploaded file's extension + $ext = strtolower(pathinfo($img, PATHINFO_EXTENSION)); + // can upload same image using rand function + $final_image = "Image".rand(1000,1000000).$img; + // check's valid format + if(in_array($ext, $valid_extensions)) + { + $simage = $path.strtolower($final_image); + if(move_uploaded_file($tmp,$simage)) + {}} } + $tblname="testimonial"; + $wheredata=(array('id'=>$id)); + $values=array( + 'name'=>$Title, + 'message'=>$Detail, + 'image'=>$simage, + + 'udate'=>date('Y-m-d H:i:s'), + + ); + $result=$this->commonsql_model->updateTable($tblname,$wheredata,$values); + if($result) + { + $this->session->set_userdata('suc','successfully Updated'); + redirect('admin/testimonial'); + + } + else + { + $this->session->set_userdata('err','Please try again'); + redirect('admin/testimonial'); + } + + + } + $data['tes']=$this->Testimonial_model->list_testimonial($id); + $this->load->view('admin/testimonial/edit',$data); + } + function check_uncheck_testimonial() + { + $id=$_POST['id']; + $value=$_POST['val']; + $tblname="testimonial"; + $where=array('id'=>$id); + $update=array('status'=>$value); + $results=$this->commonsql_model->updateTable($tblname,$where,$update); + if($results) + { + echo "1"; + } + else + { + echo "2"; + } + } +} +?> \ No newline at end of file diff --git a/application/controllers/User.php b/application/controllers/User.php new file mode 100644 index 0000000..5898eeb --- /dev/null +++ b/application/controllers/User.php @@ -0,0 +1,126 @@ +load->model('Dashboard_model'); + + + } + /** + * Index Page for this controller. + * + * Maps to the following URL + * http://example.com/index.php/welcome + * - or - + * http://example.com/index.php/welcome/index + * - or - + * Since this controller is set as the default controller in + * config/routes.php, it's displayed at http://example.com/ + * + * So any other public methods not prefixed with an underscore will + * map to /index.php/welcome/ + * @see https://codeigniter.com/user_guide/general/urls.html + */ + public function index() + { + $this->load->view('front/index'); + } + function login() + { + $this->load->view('admin/login'); + } + function dashboard() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + $data['quo']=$this->Dashboard_model->get_quotes(); + $data['req']=$this->Dashboard_model->get_request(); + $data['res']=$this->Dashboard_model->get_response(); + $data['ongo']=$this->Dashboard_model->get_onboard(); + $data['com']=$this->Dashboard_model->get_completed(); + $data['quo_det']=$this->Dashboard_model->get_quotes_details(); + $data['req_det']=$this->Dashboard_model->get_request_details(); + $data['res_det']=$this->Dashboard_model->get_response_details(); + $data['on_det']=$this->Dashboard_model->get_onboard_details(); + $data['com_det']=$this->Dashboard_model->get_complete_details(); + $this->load->view('admin/dashboard',$data); + } + function login_validation() + { + // echo "sdfdsf";exit; + $username = $this->input->post('username'); + $password = $this->input->post('password'); + $check_user=$this->commonsql_model->user($username,$password); + //echo $this->db->last_query();exit; + if($check_user->num_rows()>0) + { + $ch = $check_user->row(); + + + $this->session->set_userdata('id',$ch->id); + $this->session->set_userdata('name',$ch->name); + $this->session->set_userdata('role_id',$ch->role); + $this->session->set_userdata('email',$ch->email); + $this->session->set_userdata('mobile',$ch->mobile); + + $this->session->set_userdata('suc','Successfully Logged in..!'); + redirect('admin/dashboard'); + } + else + { + $this->session->set_userdata('err','The username or password you entered is incorrect.'); + redirect('admin/login'); + } + } + function logout() + { + $session_data=array('username'=>''); + $this->session->unset_userdata($session_data); + $this->session->sess_destroy(); + redirect('admin/login'); + + } + function profile() + { + if($this->session->userdata('id')==""){redirect('admin/login');} + if($this->input->post('update_profile')) + { + $username=$this->input->post('username'); + $new_password=$this->input->post('new_password'); + $unique_id=$this->input->post('unique_id'); + $old_password=$this->input->post('old_password'); + + + $password=$old_password; + + if($username==""){$this->session->set_userdata('err','User Name is a required field');redirect('admin/profile');} + + if($new_password!=""){$password=md5($new_password);} + + $values=array('username'=>$username,'password'=>$password); + $tablename="staff";$wheredata=array('id'=>$unique_id); + + $update_user=$this->commonsql_model->updateTable($tablename,$wheredata,$values); + + if($update_user) + { + $this->session->set_userdata('suc'," Successfully updated!"); + redirect('admin/profile'); + + } + else + { + + $this->session->set_userdata('err'," Please try again"); + redirect('admin/profile'); + } + + + + } + $this->load->view('admin/profile'); + } +} +?> \ No newline at end of file diff --git a/application/controllers/index.html b/application/controllers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/controllers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/controllers/new 2.txt b/application/controllers/new 2.txt new file mode 100644 index 0000000..31660cc --- /dev/null +++ b/application/controllers/new 2.txt @@ -0,0 +1,28 @@ +// compare details + foreach($comparefields as $ke=>$val) + { + $tblname="category_compare_master"; + if (is_numeric($comparefields[$ke])){ + + $cid = $comparefields[$ke]; + } + else{ + + $values=array('compare_name'=>ucwords($comparefields[$ke]), + 'status'=>1); + + if($comparefields[$ke]!="") { + $result=$this->commonsql_model->insert_table($tblname,$values); + } + $cid = $this->db->insert_id(); + + } + $tblnames="category_compare_detail"; + $value=array( + 'category'=>$catid, + 'compare'=>$cid , + 'status'=>1); + if($catid!="" && $cid!="") { + $result=$this->commonsql_model->insert_table($tblnames,$value); + } + } \ No newline at end of file diff --git a/application/core/index.html b/application/core/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/core/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/helpers/custom_helper.php b/application/helpers/custom_helper.php new file mode 100644 index 0000000..9ef63d2 --- /dev/null +++ b/application/helpers/custom_helper.php @@ -0,0 +1,67 @@ +commonsql_model->page_access_check($role,$userid,$module,$submodule,$page); + //echo $CI->db->last_query(); + if($page_access_module->num_rows()>0){ + return TRUE; + }else{ + return FALSE; + } + } + } + + + + function times_counter($time){ + + $seconds = 0; + foreach($time as $t) + { + $new=$t.":00"; + $timeArr = array_reverse(explode(":", $new)); + + foreach ($timeArr as $key => $value) + { + if ($key > 2) break; + $seconds += pow(60, $key) * $value; + } + + } + +$hours = floor($seconds / 3600); +$mins = floor(($seconds - ($hours*3600)) / 60); +//$secs = floor($seconds % 60); + +echo $hours.':'.$mins; +} \ No newline at end of file diff --git a/application/helpers/financial_year_helper.php b/application/helpers/financial_year_helper.php new file mode 100644 index 0000000..d81984a --- /dev/null +++ b/application/helpers/financial_year_helper.php @@ -0,0 +1,90 @@ + + + +
+ + + + + + + + + + + + + load->model('Finance_model'); + $table=$CI->Finance_model->show_date($get_controller_start,$get_controller_end); + if(isset($table) && $table->num_rows()>0) + { + $i=1; + foreach($table->result() as $rep) + { + $ledger_id=$rep->ledger_id; + $ledger_name=$rep->ledger_name; + $opening_balance=$rep->opening_balance; + $ob_debit_credit_id=$rep->ob_debit_credit_id; + $closing_balance=$rep->closing_balance; + $cb_debit_credit=$rep->cb_debit_credit; + if($ob_debit_credit_id==1) + { + $ob_debit_credit_id="Dr"; + } + else + { + $ob_debit_credit_id="Cr"; + } + + if($cb_debit_credit==1) + { + $cb_debit_credit="Dr"; + } + else + { + $cb_debit_credit="Cr"; + } + ?> + + + + + + + + + + + +
+ + Ledger Name Opening Balance Closing Balance
+ + + + + + + + + +

No result found

+
+ + diff --git a/application/helpers/index.html b/application/helpers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/helpers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/helpers/ledger_helper.php b/application/helpers/ledger_helper.php new file mode 100644 index 0000000..d73105c --- /dev/null +++ b/application/helpers/ledger_helper.php @@ -0,0 +1,135 @@ +load->model('commonsql_model'); + $tableName="ledger"; + $whereData=array('status'=>1,'type'=>$values);$order="ledger_id"; + $seller=$CI->commonsql_model->selectTable($tableName, $whereData,'',$order); + +?> +
+
+
+ +
+
+
+ +
+
+ +
+ +
+
+
+ + + + + + + + + + + + + + num_rows()>0) + { + + $i=1; + foreach($seller->result() as $b) + { + $id=$b->ledger_id; + $cname=$b->customer_name; + $name=$b->company; + $contact=$b->contact_number; + $email=$b->email; + $address=$b->address; + $status=$b->status; + ?> + + + + + + + + + + + + +
S NOContact NumberEmailAddress ACTION
+ +
No record found
+
+
+
+ +
+ + + +
+
+ \ No newline at end of file diff --git a/application/helpers/page_helper.php b/application/helpers/page_helper.php new file mode 100644 index 0000000..c3b9cb4 --- /dev/null +++ b/application/helpers/page_helper.php @@ -0,0 +1,147 @@ +load->model('commonsql_model'); + $tableName="module"; + $whereData=array('status'=>1); + $module_list=$CI->commonsql_model->selectTable($tableName, $whereData,'','','','module_order'); + $tableName="module_sub"; + $whereData=array('status'=>1); + $sub_module_list=$CI->commonsql_model->selectTable($tableName, $whereData,''); +?> +
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($module_list->result() as $m_list) + { + $module_id=$m_list->module_id; + $module_name=$m_list->module_name; + + $tableName="page_access"; + $whereData=array('page_module_id'=>$module_id,'page_role_id'=>$role,'page_user_id'=>$emp,'status'=>1); + $access=$CI->commonsql_model->selectTable($tableName,$whereData); + //echo $CI->db->last_query(); + $page_add="0"; $page_view="0"; $page_edit="0"; $page_delete="0"; $page_notify="0"; + + + if($access->num_rows()>0) + { + $acc=$access->row(); + + $page_add = $acc->page_add; + $page_view = $acc->page_view; + $page_edit = $acc->page_edit; + $page_delete = $acc->page_delete; + $page_notify = $acc->page_notify; + + } + + ?> + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($sub_module_list->result() as $s_list) + { + $sub_module_id=$s_list->sub_module_id; + $sub_module_name=$s_list->sub_module_name; + $sub_module_module_id=$s_list->sub_module_module_id; + + $tableName="page_access"; + $whereData=array('page_submodule_id'=>$sub_module_id,'page_module_id'=>$sub_module_module_id,'page_role_id'=>$role,'page_user_id'=>$emp,'status'=>1); + $access1=$CI->commonsql_model->selectTable($tableName,$whereData); + //echo $CI->db->last_query(); + $page_add="0"; $page_view="0"; $page_edit="0"; $page_delete="0"; $page_notify="0"; + + + if($access1->num_rows()>0) + { + $acc1=$access1->row(); + + $page_add = $acc1->page_add; + $page_view = $acc1->page_view; + $page_edit = $acc1->page_edit; + $page_delete = $acc1->page_delete; + $page_notify = $acc1->page_notify; + + } + if($module_id == $sub_module_module_id) + { + ?> + + + + + + + + + + + + +
MODULE SUB MODULE ADD VIEW EDIT DELETE Notification
checked > checked > checked > checked > checked >
checked > checked > checked > checked > checked >
+
+
+ + + \ No newline at end of file diff --git a/application/helpers/pdf_helper.php b/application/helpers/pdf_helper.php new file mode 100644 index 0000000..e1c901c --- /dev/null +++ b/application/helpers/pdf_helper.php @@ -0,0 +1,162 @@ + '', + 1 => 'One', + 2 => 'Two', + 3 => 'Three', + 4 => 'Four', + 5 => 'Five', + 6 => 'Six', + 7 => 'Seven', + 8 => 'Eight', + 9 => 'Nine', + 10 => 'Ten', + 11 => 'Eleven', + 12 => 'Twelve', + 13 => 'Thirteen', + 14 => 'Fourteen', + 15 => 'Fifteen', + 16 => 'Sixteen', + 17 => 'Seventeen', + 18 => 'Eighteen', + 19 => 'Nineteen', + 20 => 'Twenty', + 30 => 'Thirty', + 40 => 'Forty', + 50 => 'Fifty', + 60 => 'Sixty', + 70 => 'Seventy', + 80 => 'Eighty', + 90 => 'Ninety'); + $digits = array('', 'Hundred', 'Thousand', 'Lakh', 'Crore'); + while ($i < $digits_length) { + $divider = ($i == 2) ? 10 : 100; + $number = floor($no % $divider); + $no = floor($no / $divider); + $i += $divider == 10 ? 1 : 2; + if ($number) { + $plural = (($counter = count($str)) && $number > 9) ? 's' : null; + $str [] = ($number < 21) ? $words[$number] . ' ' . $digits[$counter] . $plural : $words[floor($number / 10) * 10] . ' ' . $words[$number % 10] . ' ' . $digits[$counter] . $plural; + } else { + $str [] = null; + } + } + + $Rupees = implode(' ', array_reverse($str)); + $paise = ($decimal) ? "And Paise " . ($words[$decimal - $decimal%10]) ." " .($words[$decimal%10]) : ''; + return ($Rupees ? '' . $Rupees : '') . $paise . ""; +} + +/** + * Function to dislay tens and ones + */ +function commonloop($val, $str1 = '', $str2 = '') { + global $ones, $tens; + $string = ''; + if ($val == 0) + $string .= $ones[$val]; + else if ($val < 20) + $string .= $str1.$ones[$val] . $str2; + else + $string .= $str1 . $tens[(int) ($val / 10)] . $ones[$val % 10] . $str2; + return $string; +} + +/** + * returns the number as an anglicized string + */ +function convertNum($num) { + $num = (int) $num; // make sure it's an integer + + if ($num < 0) + return 'negative' . convertTri(-$num, 0); + + if ($num == 0) + return 'Zero'; + return convertTri($num, 0); +} + +/** + * recursive fn, converts numbers to words + */ +function convertTri($num, $tri) { + global $ones, $tens, $triplets, $count; + $test = $num; + $count++; + // chunk the number, ...rxyy + // init the output string + $str = ''; + // to display hundred & digits + if ($count == 1) { + $r = (int) ($num / 1000); + $x = ($num / 100) % 10; + $y = $num % 100; + // do hundreds + if ($x > 0) { + $str = $ones[$x] . ' Hundred'; + // do ones and tens + $str .= commonloop($y, ' and ', ''); + } + else if ($r > 0) { + // do ones and tens + $str .= commonloop($y, ' and ', ''); + } + else { + // do ones and tens + $str .= commonloop($y); + } + } + // To display lakh and thousands + else if($count == 2) { + $r = (int) ($num / 10000); + $x = ($num / 100) % 100; + $y = $num % 100; + $str .= commonloop($x, '', ' Lakh '); + $str .= commonloop($y); + if ($str != '') + $str .= $triplets[$tri]; + } + // to display till hundred crore + else if($count == 3) { + $r = (int) ($num / 1000); + $x = ($num / 100) % 10; + $y = $num % 100; + // do hundreds + if ($x > 0) { + $str = $ones[$x] . ' Hundred'; + // do ones and tens + $str .= commonloop($y,' and ',' Crore '); + } + else if ($r > 0) { + // do ones and tens + $str .= commonloop($y,' and ',' Crore '); + } + else { + // do ones and tens + $str .= commonloop($y); + } + } + else { + $r = (int) ($num / 1000); + } + // add triplet modifier only if there + // is some output to be modified... + // continue recursing? + if ($r > 0) + return convertTri($r, $tri+1) . $str; + else + return $str; +} +?> \ No newline at end of file diff --git a/application/hooks/index.html b/application/hooks/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/hooks/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/index.html b/application/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/language/english/index.html b/application/language/english/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/language/english/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/language/index.html b/application/language/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/language/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/libraries/index.html b/application/libraries/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/libraries/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/logs/index.html b/application/logs/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/logs/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/models/Blog_model.php b/application/models/Blog_model.php new file mode 100644 index 0000000..a667903 --- /dev/null +++ b/application/models/Blog_model.php @@ -0,0 +1,22 @@ +db->select('*'); + $this->db->from('blog'); + + if($id!=0){$this->db->where(array('id'=>$id));} + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + +} diff --git a/application/models/Category_model.php b/application/models/Category_model.php new file mode 100644 index 0000000..619ed97 --- /dev/null +++ b/application/models/Category_model.php @@ -0,0 +1,68 @@ +db->select('*'); + $this->db->from('categories'); + $this->db->where(array('status'=>1)); + if($id!=""){ $this->db->where(array('id'=>$id)); } + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_compare_master() + { + $this->db->select('*'); + $this->db->from('category_compare_master'); + $this->db->where(array('status'=>1)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_document_master() + { + $this->db->select('*'); + $this->db->from('documents_master'); + $this->db->where(array('status'=>1)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_compare_details($id) + { + $this->db->select('cd.*,cm.compare_name'); + $this->db->from('category_compare_detail as cd'); + $this->db->join('category_compare_master as cm','cm.id=cd.compare','left'); + $this->db->where(array('cm.status'=>1,'cd.status'=>1,'category'=>$id)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function questions_before_quote($id) + { + $this->db->select('*'); + $this->db->from('category_questions_before_quote'); + $this->db->where(array('status'=>1,'category'=>$id)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_document_details($id) + { + $this->db->select('cd.*,cm.name as docname'); + $this->db->from('category_document_details as cd'); + $this->db->join('documents_master as cm','cm.id=cd.document','left'); + $this->db->where(array('cm.status'=>1,'cd.status'=>1,'category'=>$id)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } +} diff --git a/application/models/Commonsql_model.php b/application/models/Commonsql_model.php new file mode 100644 index 0000000..790ae8e --- /dev/null +++ b/application/models/Commonsql_model.php @@ -0,0 +1,196 @@ + 0) { + $this->db->insert($tableName, $tableData); + return $this->db->insert_id(); + } + return false; + } + + /* get the data to table + * $tableName -> Name of the table + * $whereData -> Array -> where fields + * $showField -> Array -> what are the fields need to show + * */ + + public function selectTable($tableName, $whereData = array(), $showField = array('*'), $order = '') { + + $this->db->select($showField); + $this->db->from($tableName); + if (!empty($whereData) > 0) { + $this->db->where($whereData); + } + if ($order != '') { + $this->db->order_by($order,"DESC"); + } + /*if (count($limit>0)) { + //$this->db->limit($limit[0],$limit[1]);//example $limit[0] = "0,10" where 0 is for offset and 10 for limit + }*/ + $query = $this->db->get(); + + return $query; + } + + + /* update the data to table + * $tableName -> Name of the table + * $whereData -> Array -> where fields + * $updateData -> Array -> updated fields and data + * */ + + public function updateTable($tableName, $whereData = array(), $updateData = array()) { + $this->db->where($whereData); + $this->db->update($tableName, $updateData); + $return = $this->db->affected_rows() > 0; + return $return; + //$query->result_array(); + //$query->num_rows(); + } + + /* update the data to table + * $tableName -> Name of the table + * $whereData -> Array -> where fields + * $updateData -> Array -> updated fields and data + * */ + + public function deleteTableData($tableName, $whereData = array()) { + // Insert the user record + if (isset($whereData) && count($whereData) > 0) { + $insert_id = $this->db->delete($tableName, $whereData); + return true; + } + return false; + } + + function user($username,$password) + { + $this->db->select('*'); + $this->db->from('staff'); + $this->db->where('username',$username); + $this->db->where(array('password'=>md5($password),'status'=>1)); + $query = $this->db->get(); + return $query; + } + function type() + { + $this->db->select('mat.mat_mas_id,mat.mat_mas_name,mat.opening,mat.minimum,mat.des,m.mat_type,u.mat_unit'); + $this->db->from('material_master as mat'); + $this->db->join('material_type as m',' m.type_id = mat.mat_mas_type', 'INNER'); + $this->db->join('material_unit as u','u.unit_id = mat.mat_mas_unit','INNER'); + $this->db->where('mat.status',1); + $query = $this->db->get(); + return $query; + } + + function role() + { + $this->db->select('emp.emp_id,emp.emp_name,emp.contact_number,emp.address,emp.role_id,r.role_name,r.role_id'); + $this->db->from('employee as emp'); + $this->db->join('role as r','emp.role_id= r.role_id '); + $this->db->where('emp.status',1); + $query = $this->db->get(); + + return $query; + } + function module_list() + { + $this->db->select('ms.sub_id,ms.sub_name,m.module_id,m.module_name'); + $this->db->from('sub_module AS ms'); + $this->db->join('module AS m','ms.module_id=m.module_id','INNER'); + $this->db->where(array('ms.status'=>1,'m.status'=>1)); + $query = $this->db->get(); + return $query; + } + + + function rol($roleid) { + + $this->db->select('*'); + $this->db->from('page_access'); + $this->db->where('role_id',$roleid); + $query = $this->db->get(); + + return $query; + } + + function materialsku(){ + $this->db->select('product_id,quantity,sk.sku_name,mm.mat_mas_name,sk.sku_id,mu.mat_unit'); + $this->db->from('material_sku AS ms'); + $this->db->join('material_master AS mm','mm.mat_mas_id=ms.product_id','INNER'); + $this->db->join('sku AS sk','sk.sku_id=ms.sku_id','INNER'); + $this->db->join('material_unit AS mu','mu.unit_id=mm.mat_mas_unit','LEFT'); + $query = $this->db->get(); + return $query; + } + function check_emp_userlogin($id) + { + $this->db->select('*'); + $this->db->from('login'); + $this->db->where('emp_id',$id); + + $query = $this->db->get(); + return $query; + } + function check_emp_ledr($id) + { + $this->db->select('*'); + $this->db->from('employee'); + $this->db->where('emp_id',$id); + + $query = $this->db->get(); + return $query; + } + function page_access_check($role,$userid,$module,$submodule,$page){ + $this->db->select('p.*'); + $this->db->from('page_access as p'); + if($page==1){ $this->db->where('p.page_add',1);} + else if($page==2){ $this->db->where('p.page_view',1);} + else if($page==3){ $this->db->where('p.page_edit',1);} + else if($page==4){ $this->db->where('p.page_delete',1);} + else if($page==5){ $this->db->where('p.page_notify',1);} + $this->db->where(array('p.page_role_id'=>$role,'p.page_user_id'=>$userid,'p.page_module_id'=>$module,'p.page_submodule_id'=>$submodule,'p.status'=>1)); + $query = $this->db->get(); + return $query; + + } + function page_access_module($role,$emp){ + + $this->db->select('p.page_id,p.page_role_id,p.page_user_id,p.page_module_id,p.status,m.*'); + $this->db->from('page_access as p'); + $this->db->join('module as m','p.page_module_id=m.module_id','LEFT'); + //$this->db->join('module_sub as sm','p.page_submodule_id=sm.sub_module_id','LEFT'); + $this->db->group_by('p.page_module_id'); + $this->db->where(array('p.status'=>1,'p.page_role_id'=>$role,'p.page_user_id'=>$emp)); + $query = $this->db->get(); + return $query; + } + function pageaccess_submodule($id,$role,$emp) + { + $this->db->distinct(); + $this->db->select('p.*,m.sub_module_id,m.sub_module_name,m.sub_module_route,m.sub_module_icon'); + $this->db->from('page_access as p'); + $this->db->join('module_sub as m','p.page_submodule_id=m.sub_module_id','RIGHT'); + + $this->db->where(array('p.page_module_id'=>$id,'p.status'=>1,'p.page_role_id'=>$role,'p.page_user_id'=>$emp)); + $query = $this->db->get(); + return $query; + } + function emp_bus_id($eid) + { + $this->db->select('emp_cmp_id'); + $this->db->from('employee'); + $this->db->where('emp_id',$eid); + $query = $this->db->get(); + return $query; + } +} diff --git a/application/models/Company_model.php b/application/models/Company_model.php new file mode 100644 index 0000000..83a2e35 --- /dev/null +++ b/application/models/Company_model.php @@ -0,0 +1,21 @@ +db->select('*'); + $this->db->from('companies'); + $this->db->where(array('status'=>1)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + +} diff --git a/application/models/Dashboard_model.php b/application/models/Dashboard_model.php new file mode 100644 index 0000000..9553669 --- /dev/null +++ b/application/models/Dashboard_model.php @@ -0,0 +1,118 @@ +db->select('count(id) as quotecount'); + $this->db->from('quotes'); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_request() + { + $this->db->select('count(id) as requestcount'); + $this->db->from('quotes'); + $this->db->where("status",0); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_response() + { + $this->db->distinct(); + $this->db->select('quote_id'); + $this->db->from('quote_response'); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_onboard() + { + + $this->db->select('count(id) as oncount'); + $this->db->from('quotes'); + $this->db->where(array('status!='=>2)); + $this->db->where(array('status!='=>0)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_completed() + { + $this->db->select('count(id) as comcount'); + $this->db->from('quotes'); + $this->db->where(array('status'=>2)); + + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_quotes_details() + { + $this->db->select('a.*,b.name as policyname,b.permalink,b.category'); + $this->db->from('quotes as a'); + $this->db->join('policies as b','b.id=a.policy_id','inner'); + $this->db->where(array('a.policy_id!='=>0)); + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_request_details() + { + $this->db->select('a.*,b.name as policyname,b.permalink,b.category'); + $this->db->from('quotes as a'); + $this->db->join('policies as b','b.id=a.policy_id','inner'); + $this->db->where(array('a.policy_id!='=>0,'a.status'=>0)); + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_onboard_details() + { + $this->db->select('a.*,b.name as policyname,b.permalink,b.category'); + $this->db->from('quotes as a'); + + $this->db->join('policies as b','b.id=a.policy_id','inner'); + $this->db->where(array('a.status!='=>2)); + $this->db->where(array('a.status!='=>0)); + + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + // echo $this->db->last_query();exit; + return $query; + } + function get_response_details() + { + $this->db->select('a.*,b.name as policyname,b.permalink,b.category,qr.mobile,qr.email,qr.message'); + $this->db->from('quotes as a'); + $this->db->join('quote_response as qr','qr.quote_id=a.id','inner'); + $this->db->join('policies as b','b.id=a.policy_id','inner'); + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + // echo $this->db->last_query();exit; + return $query; + } + function get_complete_details() + { + $this->db->select('a.*,b.name as policyname,b.permalink,b.category'); + $this->db->from('quotes as a'); + + $this->db->join('policies as b','b.id=a.policy_id','inner'); + $this->db->where(array('a.status'=>2)); + + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + // echo $this->db->last_query();exit; + return $query; + } +} diff --git a/application/models/Faq_model.php b/application/models/Faq_model.php new file mode 100644 index 0000000..510ae15 --- /dev/null +++ b/application/models/Faq_model.php @@ -0,0 +1,21 @@ +db->select('*'); + $this->db->from('faq'); + if($id!=0){ $this->db->where('id',$id); } + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + +} diff --git a/application/models/Frontend_model.php b/application/models/Frontend_model.php new file mode 100644 index 0000000..ba889e8 --- /dev/null +++ b/application/models/Frontend_model.php @@ -0,0 +1,389 @@ +db->select('p.*,cm.name as cmpname,ca.name as catname'); + $this->db->from('policies as p'); + $this->db->join('companies as cm','cm.id=p.company','left'); + $this->db->join('categories as ca','ca.id=p.category','left'); + $this->db->where(array('p.status'=>1,'cm.status'=>1,'ca.status'=>1)); + if($id!=0){ $this->db->where(array('p.id'=>$id)); } + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function frontusercheck($username,$password) + { + $this->db->select('*'); + $this->db->from('users'); + $this->db->where('email',$username); + $this->db->where(array('password'=>md5($password))); + $query = $this->db->get(); + return $query; + } + function agent_racetype() + { + $this->db->select('*'); + $this->db->from('agent_racetype'); + $this->db->where('status',1); + + $query = $this->db->get(); + return $query; + } + function agent_detail($id=0) + { + $this->db->select('a.*,cm.name as cmpname,u.name as agentname,u.password,u.profilepic'); + $this->db->from('agents as a'); + $this->db->join('users as u','u.id=a.user_id','INNER'); + $this->db->join('companies as cm','cm.id=a.company','left'); + + $this->db->where(array('a.status'=>1,'cm.status'=>1)); + if($id!=0){ $this->db->where(array('a.user_id'=>$id)); } + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function user_review_to_agent($id=0) + { + $this->db->select('r.*,u.name as username'); + $this->db->from('reviews as r'); + $this->db->join('users as u','u.id=r.user_id','left'); + if($id!=0){ $this->db->where(array('r.agency_id'=>$id)); } + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function show_quote_to_agent() + { + $this->db->select('a.*,b.email,b.mobile,b.name,b.city,b.state,b.country,b.userrole,b.pincode,c.company'); + $this->db->from('quotes as a'); + $this->db->join('users as b','b.id=a.user_id','inner'); + $this->db->join('policies as c','c.id=a.policy_id','left'); + + //$this->db->where(array('a.agency_id'=>0)); + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + //echo $this->db->last_query(); + return $query; + } + function select_pincode_agentcount($pin,$cont,$cmp) + { + $this->db->select('a.*,b.company,b.experience,b.racetype,ABS( a.pincode - '.$pin.' ) AS pincode'); + $this->db->from('users as a'); + $this->db->join('agents as b','b.user_id=a.id','inner'); + $this->db->where(array('a.userrole'=>1,'a.status'=>1,'b.company'=>$cmp)); + + $this->db->order_by('pincode'); + $this->db->limit($cont); + $query = $this->db->get(); + //echo $this->db->last_query(); exit; + return $query; + } + function show_quote_to_user($id) + { + $this->db->select('a.*,b.name as policyname,b.permalink,b.category'); + $this->db->from('quotes as a'); + $this->db->join('policies as b','b.id=a.policy_id','inner'); + $this->db->where(array('a.policy_id!='=>0,'a.user_id'=>$id)); + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_already_send_quote_details($polid,$primaryid) + { + $this->db->select('*'); + $this->db->from('quotes'); + $this->db->where(array('policy_id'=>$polid,'user_id'=>$primaryid)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function list_policy_agent_having($catid) + { + $this->db->select('b.*,a.name as agentname,a.profilepic'); + $this->db->from('users as a'); + $this->db->join('agents as b','b.user_id=a.id','inner'); + + $this->db->where('find_in_set("'.$catid.'", b.category)'); + $this->db->where(array('a.status'=>1,'b.status'=>1)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function agent_review_from_user($agid) + { + $this->db->select('a.*,b.name as username'); + $this->db->from('reviews as a'); + $this->db->join('users as b','b.id=a.user_id','inner'); + $this->db->where(array('a.status'=>1,'agency_id'=>$agid)); + $query = $this->db->get(); + //echo $this->db->last_query(); + return $query; + } + function agent_completed_policy($agid) + { + $this->db->select('*'); + $this->db->from('quotes'); + $this->db->where(array('status'=>2,'agency_id'=>$agid)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function write_review_permission($user,$policy) + { + $this->db->select('*'); + $this->db->from('quotes'); + $this->db->where(array('status'=>2,'user_id'=>$user,'policy_id'=>$policy)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function show_response_detail_to_user($uid,$quoteid) + { + $this->db->select('q.*,a.name as agentname,a.profilepic'); + $this->db->from('quote_response as q'); + $this->db->join('users as a','a.id=q.agency_id','inner'); + $this->db->where(array('q.user_id'=>$uid,'q.quote_id'=>$quoteid)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function show_single_agent_response_detail_to_user($qid,$aid,$uid) + { + $this->db->select('q.*,a.name as agentname'); + $this->db->from('quote_response as q'); + $this->db->join('users as a','a.id=q.agency_id','inner'); + $this->db->where(array('q.status'=>0,'q.agency_id'=>$aid,'q.user_id'=>$uid,'q.quote_id'=>$qid)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function show_response_to_agent_for_accept($aid) + { + $this->db->select('a.*,b.name,b.city,b.state,b.country'); + $this->db->from('quotes as a'); + $this->db->join('users as b','b.id=a.user_id','inner'); + $this->db->where(array('a.agency_id'=>$aid)); + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function show_response_to_user_for_accept_complete($uid) + { + $this->db->select('a.*,b.name as policyname,b.category'); + $this->db->from('quotes as a'); + $this->db->join('policies as b','b.id=a.policy_id','inner'); + $this->db->join('agents as c ','c.user_id=a.agency_id','inner'); + $this->db->where(array('a.user_id'=>$uid)); + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function agent_approve_review_to_user($id=0) + { + $this->db->select('r.*,u.name as agentname'); + $this->db->from('reviews as r'); + $this->db->join('users as u','u.id=r.agency_id','left'); + if($id!=0){ $this->db->where(array('r.user_id'=>$id)); } + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function select_sent_quotes_from_user($pid,$uid) + { + $this->db->select('*'); + $this->db->from('quotes'); + $this->db->where(array('policy_id'=>$pid,'user_id'=>$uid,'agency_id'=>0,'status!='=>2)); + + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_categorywise_policy_with_agelimit($cid,$age=0) + { + $this->db->select('p.*,cm.name as cmpname,cm.logo'); + $this->db->from('policies as p'); + $this->db->join('companies as cm','cm.id=p.company','left'); + $this->db->where(array('p.status'=>1,'cm.status'=>1,'p.is_this_top_plan'=>0)); + $this->db->where(array('p.category'=>$cid)); + if($age!=""){ $this->db->where('p.max_cover_age>=',$age); } + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_company_name($cid) + { + $this->db->select('*'); + $this->db->from('companies'); + $this->db->where(array('status'=>1,'id'=>$cid)); + $query = $this->db->get(); + + return $query; + } + function get_categorywise_policy_with_agelimit_top($cid,$age=0) + { + $this->db->select('p.*,cm.name as cmpname,cm.logo'); + $this->db->from('policies as p'); + $this->db->join('companies as cm','cm.id=p.company','left'); + $this->db->where(array('p.status'=>1,'cm.status'=>1,'p.is_this_top_plan'=>1)); + $this->db->where(array('p.category'=>$cid)); + if($age!=""){ $this->db->where('p.max_cover_age>=',$age); } + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_categorydetails_for_categoryview($cid) + { + $this->db->select('*'); + $this->db->from('categories'); + $this->db->where(array('id'=>$cid,'status'=>1)); + + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_category_questions($id) + { + $this->db->select('*'); + $this->db->from('category_questions_before_quote'); + $this->db->where(array('category'=>$id,'status'=>1)); + + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function check_mobile_exist_for_login_register($mob) + { + $this->db->select('*'); + $this->db->from('users'); + $this->db->where(array('mobile'=>$mob)); + $query = $this->db->get(); + + return $query; + } + function get_policy_compare($pid,$plan) + { + $this->db->select('p.*,cm.name as cmpname,cm.logo'); + $this->db->from('policies as p'); + $this->db->join('companies as cm','cm.id=p.company','left'); + $this->db->where(array('p.status'=>1,'cm.status'=>1,'p.is_this_top_plan'=>$plan)); + $this->db->where(array('p.id'=>$pid)); + + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_comparisions($cid,$pol) + { + $this->db->select('p.*,cm.name as cmpname,cm.logo'); + $this->db->from('policies as p'); + $this->db->join('companies as cm','cm.id=p.company','left'); + $this->db->where(array('p.status'=>1,'cm.status'=>1,'p.category'=>$cid)); + $this->db->where_in('p.id',$pol); + + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_compare_details($cm,$pol,$cat) + { + + $this->db->select('cd.comparedetail'); + $this->db->from('policy_compare_details as cd'); + $this->db->where(array('compare'=>$cm,'policy'=>$pol,'cd.status'=>1,'cd.category'=>$cat)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_comparisions_master($cat,$pol) + { + $this->db->distinct(); + $this->db->select('cd.compare,cm.compare_name'); + $this->db->from('policy_compare_details as cd'); + $this->db->join('category_compare_master as cm','cm.id=cd.compare','LEFT'); + $this->db->where(array('cd.status'=>1,'cd.category'=>$cat)); + $this->db->where_in('policy',$pol); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_recent_order_details($id) + { + + $this->db->select('q.*,p.name as policyname'); + $this->db->from('quotes as q'); + $this->db->join('policies as p','p.id=q.policy_id','left'); + $this->db->where(array('user_id'=>$id)); + $this->db->order_by("id","DESC"); + $this->db->limit(5); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_recent_order_details_agent($id) + { + + $this->db->select('q.*,p.name as policyname'); + $this->db->from('quotes as q'); + $this->db->join('policies as p','p.id=q.policy_id','left'); + $this->db->where(array('q.agency_id'=>$id)); + $this->db->order_by("id","DESC"); + $this->db->limit(5); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_documents_collection($cid) + { + $this->db->select('cd.*,dm.name as doc_name,c.name as catname'); + $this->db->from('category_document_details cd'); + $this->db->join('documents_master dm','dm.id=cd.document','left'); + $this->db->join('categories c','c.id=cd.category','left'); + $this->db->where(array('cd.category'=>$cid,'cd.status'=>1,'c.status'=>1,'dm.status'=>1)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_details_of_quote_user($qid) + { + $this->db->select('q.*,u.name as username'); + $this->db->from('quotes as q'); + $this->db->join('users as u','u.id=q.user_id','left'); + $this->db->where(array('q.id'=>$qid,'u.status'=>1,'q.status'=>1)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_current_policy_detail($cid) + { + $this->db->select('p.*,cm.logo,cm.name as cmpname,ca.name as catname'); + $this->db->from('policies as p'); + $this->db->join('companies as cm','cm.id=p.company','left'); + $this->db->join('categories as ca','ca.id=p.category','left'); + $this->db->where(array('p.status'=>1,'cm.status'=>1,'ca.status'=>1)); + $this->db->where(array('p.category'=>$cid)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_agent_det_to_show_quote($aid) + { + $this->db->select('r.id,r.status,a.*,b.company,b.experience,b.racetype,ABS( a.pincode - '.$pin.' ) AS pincode'); + $this->db->from('quote_response'); + $this->db->where_in('status',array(2,3)); + $query = $this->db->get(); + //echo $this->db->last_query(); + return $query; + } +} diff --git a/application/models/Lists_model.php b/application/models/Lists_model.php new file mode 100644 index 0000000..1d652e4 --- /dev/null +++ b/application/models/Lists_model.php @@ -0,0 +1,34 @@ +db->select('*'); + $this->db->from('contact'); + $this->db->where('status',1); + + if($id!=0){$this->db->where(array('id'=>$id));} + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function list_review() + { + $this->db->select('r.*,u.name as username,ua.name as agentname'); + $this->db->from('reviews as r'); + $this->db->join('users as u','u.id=r.user_id','left'); + $this->db->join('users as ua','ua.id=r.agency_id','Left'); + + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + +} diff --git a/application/models/Menu_model.php b/application/models/Menu_model.php new file mode 100644 index 0000000..45b21b6 --- /dev/null +++ b/application/models/Menu_model.php @@ -0,0 +1,22 @@ +db->select('*'); + $this->db->from('menu'); + $this->db->where(array('parent_id'=>0)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + + +} diff --git a/application/models/Orders_model.php b/application/models/Orders_model.php new file mode 100644 index 0000000..91d45b6 --- /dev/null +++ b/application/models/Orders_model.php @@ -0,0 +1,27 @@ +db->select('a.*,b.name as policyname,b.permalink,b.category'); + $this->db->from('quotes as a'); + $this->db->join('policies as b','b.id=a.policy_id','inner'); + $this->db->where(array('a.policy_id!='=>0)); + $this->db->order_by('a.id','desc'); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + + + + + +} diff --git a/application/models/Policy_model.php b/application/models/Policy_model.php new file mode 100644 index 0000000..25ab2d2 --- /dev/null +++ b/application/models/Policy_model.php @@ -0,0 +1,47 @@ +db->select('p.*,cm.name as cmpname,ca.name as catname'); + $this->db->from('policies as p'); + $this->db->join('companies as cm','cm.id=p.company','left'); + $this->db->join('categories as ca','ca.id=p.category','left'); + $this->db->where(array('p.status'=>1,'cm.status'=>1,'ca.status'=>1)); + if($id!=0){ $this->db->where(array('p.id'=>$id)); } + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + function get_compare_master($cid) + { + $this->db->select('cm.*'); + $this->db->from('category_compare_detail as cd'); + $this->db->join('category_compare_master as cm','cm.id=cd.compare','left'); + + $this->db->where(array('cm.status'=>1,'cd.status'=>1)); + $this->db->where(array('cd.category'=>$cid)); + $query = $this->db->get(); + + return $query; + } + function get_polict_compare_details($pid) + { + $this->db->select('cd.*,cm.compare_name'); + $this->db->from('policy_compare_details as cd'); + $this->db->join('category_compare_master as cm','cm.id=cd.compare','left'); + + $this->db->where(array('cm.status'=>1,'cd.status'=>1)); + $this->db->where(array('cd.policy'=>$pid)); + $query = $this->db->get(); + // echo $this->db->last_query();exit; + return $query; + } +} diff --git a/application/models/Role_model.php b/application/models/Role_model.php new file mode 100644 index 0000000..8424664 --- /dev/null +++ b/application/models/Role_model.php @@ -0,0 +1,21 @@ +db->select('*'); + $this->db->from('staff_roles'); + $this->db->where(array('status'=>1)); + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + +} diff --git a/application/models/Slider_model.php b/application/models/Slider_model.php new file mode 100644 index 0000000..22b8b70 --- /dev/null +++ b/application/models/Slider_model.php @@ -0,0 +1,22 @@ +db->select('*'); + $this->db->from('slider'); + //$this->db->where(array('status'=>1)); + if($id!=0){$this->db->where(array('id'=>$id));} + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + +} diff --git a/application/models/Staff_model.php b/application/models/Staff_model.php new file mode 100644 index 0000000..4da3daa --- /dev/null +++ b/application/models/Staff_model.php @@ -0,0 +1,23 @@ +db->select('s.*,r.name as rolename'); + $this->db->from('staff as s'); + $this->db->join('staff_roles as r','r.id=s.role','inner'); + $this->db->where(array('s.status'=>1)); + if($id!=0){$this->db->where(array('s.id'=>$id));} + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + +} diff --git a/application/models/Testimonial_model.php b/application/models/Testimonial_model.php new file mode 100644 index 0000000..c8cac74 --- /dev/null +++ b/application/models/Testimonial_model.php @@ -0,0 +1,22 @@ +db->select('*'); + $this->db->from('testimonial'); + + if($id!=0){$this->db->where(array('id'=>$id));} + $query = $this->db->get(); + //echo $this->db->last_query();exit; + return $query; + } + +} diff --git a/application/models/index.html b/application/models/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/models/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/third_party/index.html b/application/third_party/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/third_party/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/views/admin/add_doctor.html b/application/views/admin/add_doctor.html new file mode 100644 index 0000000..f6cf398 --- /dev/null +++ b/application/views/admin/add_doctor.html @@ -0,0 +1,1408 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Add Doctor
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/add_doctor_material.html b/application/views/admin/add_doctor_material.html new file mode 100644 index 0000000..4fc8241 --- /dev/null +++ b/application/views/admin/add_doctor_material.html @@ -0,0 +1,1380 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Add Doctor
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + Enter Valid Email Address! +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + +
    +
  • Neurology
  • +
  • Orthopedics
  • +
  • Gynaecology
  • +
  • Microbiology
  • +
+
+
+
+
+ + + +
    +
  • Male
  • +
  • Female
  • +
+
+
+
+
+ + + Number required! +
+
+
+ +
+
+
+ + +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/add_patient.html b/application/views/admin/add_patient.html new file mode 100644 index 0000000..d601f49 --- /dev/null +++ b/application/views/admin/add_patient.html @@ -0,0 +1,1421 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Add Patient
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
+ + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/add_patient_material.html b/application/views/admin/add_patient_material.html new file mode 100644 index 0000000..6bb7be0 --- /dev/null +++ b/application/views/admin/add_patient_material.html @@ -0,0 +1,1399 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Add Patient
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + + +
    +
  • Male
  • +
  • Female
  • +
+
+
+
+
+ + +
+
+
+
+ + + Number required! +
+
+
+
+ + + Enter Valid Email Address! +
+
+
+
+ + +
+
+
+
+ + + +
    +
  • Single
  • +
  • Married
  • +
+
+
+
+ +
+
+
+
+
+
+ + + +
    +
  • A+
  • +
  • A-
  • +
  • B+
  • +
  • B-
  • +
  • AB+
  • +
  • AB-
  • +
  • O-
  • +
  • O-
  • +
+
+
+
+
+ + + Number required! +
+
+
+
+ + + Number required! +
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/add_payment.html b/application/views/admin/add_payment.html new file mode 100644 index 0000000..bb3d926 --- /dev/null +++ b/application/views/admin/add_payment.html @@ -0,0 +1,1375 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Add Payment
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+ + +
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/add_room_allotment.html b/application/views/admin/add_room_allotment.html new file mode 100644 index 0000000..7d7e42b --- /dev/null +++ b/application/views/admin/add_room_allotment.html @@ -0,0 +1,1339 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Add Room Allotment
+
+ +
+
+
+
+
+
+
Add Room Allotment
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/add_room_allotment_material.html b/application/views/admin/add_room_allotment_material.html new file mode 100644 index 0000000..598f5a3 --- /dev/null +++ b/application/views/admin/add_room_allotment_material.html @@ -0,0 +1,1320 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Add Room Allotment
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+ + + Number required! +
+
+
+
+ + + +
    +
  • General Word
  • +
  • Delux
  • +
  • Super Delux
  • +
  • ICU
  • +
+
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/add_staff.html b/application/views/admin/add_staff.html new file mode 100644 index 0000000..117340a --- /dev/null +++ b/application/views/admin/add_staff.html @@ -0,0 +1,1377 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Add Staff
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
+ + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/add_staff_material.html b/application/views/admin/add_staff_material.html new file mode 100644 index 0000000..4fd68d3 --- /dev/null +++ b/application/views/admin/add_staff_material.html @@ -0,0 +1,1353 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Add Staff
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + + +
    +
  • Male
  • +
  • Female
  • +
+
+
+
+
+ + +
+
+
+
+ + + Number required! +
+
+
+
+ + + Enter Valid Email Address! +
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/advance_form.html b/application/views/admin/advance_form.html new file mode 100644 index 0000000..b6cbf76 --- /dev/null +++ b/application/views/admin/advance_form.html @@ -0,0 +1,2314 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Advance Form
+
+ +
+
+
+
+
+
+
Dropzone
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+
+
+
+
+
+
Toggle
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+ + + + +
+
+ + + + +
+
+
+
+
+
+
+
+
+
+
CheckBox
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
+
Radio
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
Date & Time Picker
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+ + +
+
+ +
+ +
+
+
+ + +
+
+ +
+ + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+
+
+
+
+
+
+
Spinner
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+
+
+ +
+ +
+ + +
+
+ Basic +
+
+
+
+ +
+ + + + + + +
+ Max value: 5 +
+
+
+
+ +
+ +
+ + +
+
+ Step: 4 +
+
+
+
+ +
+ + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
Input mask
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+ +
+ + 192.168.110.310 +
+
+
+ +
+ + 99-9999999 +
+
+
+ +
+ + (999) 999-9999 +
+
+
+ +
+ + $ 999,999,999.99 +
+
+
+ +
+ + dd/mm/yyyy +
+
+
+ +
+ + dd-mm-yyyy +
+
+
+
+
+
+
+
+
+
Input mask
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
+
SELECT SINGLE & MULTIPLE
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
Color Picker
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else + here
  • +
+
+
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/advanced_table.html b/application/views/admin/advanced_table.html new file mode 100644 index 0000000..f33c4a2 --- /dev/null +++ b/application/views/admin/advanced_table.html @@ -0,0 +1,4054 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Advance Tables
+
+ +
+
+
+
+
+
+
BASIC TABLE
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePositionOfficeAgeStart dateSalary
Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
Garrett WintersAccountantTokyo632011/07/25$170,750
Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
Airi SatouAccountantTokyo332008/11/28$162,700
Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
Jena GainesOffice ManagerLondon302008/12/19$90,560
Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
Michael SilvaMarketing DesignerLondon662012/11/27$198,500
Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
Gloria LittleSystems AdministratorNew York592009/04/10$237,500
Bradley GreerSoftware EngineerLondon412012/10/13$132,000
Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
Caesar VancePre-Sales SupportNew York212011/12/12$106,450
Doris WilderSales AssistantSidney232010/09/20$85,600
Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
Shou ItouRegional MarketingTokyo202011/08/14$163,000
Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
Suki BurksDeveloperLondon532009/10/22$114,500
Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
Hope FuentesSecretarySan Francisco412010/02/12$109,850
Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
Timothy MooneyOffice ManagerLondon372008/12/11$136,200
Jackson BradshawDirectorNew York652008/09/26$645,750
Olivia LiangSupport EngineerSingapore642011/02/03$234,500
Bruno NashSoftware EngineerLondon382011/05/03$163,500
Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
Thor WaltonDeveloperNew York612013/08/11$98,540
Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
Cara StevensSales AssistantNew York462011/12/06$145,600
Hermione ButlerRegional DirectorLondon472011/03/21$356,250
Lael GreerSystems AdministratorLondon212009/02/27$103,500
Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
Donna SniderCustomer SupportNew York272011/01/25$112,000
+
+
+
+
+
+
+
+
+
SHOW/HIDE COLUMN TABLE
+
+ + + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePositionOfficeAgeStart dateSalary
Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
Garrett WintersAccountantTokyo632011/07/25$170,750
Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
Airi SatouAccountantTokyo332008/11/28$162,700
Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
Jena GainesOffice ManagerLondon302008/12/19$90,560
Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
Michael SilvaMarketing DesignerLondon662012/11/27$198,500
Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
Gloria LittleSystems AdministratorNew York592009/04/10$237,500
Bradley GreerSoftware EngineerLondon412012/10/13$132,000
Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
Caesar VancePre-Sales SupportNew York212011/12/12$106,450
Doris WilderSales AssistantSidney232010/09/20$85,600
Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
Shou ItouRegional MarketingTokyo202011/08/14$163,000
Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
Suki BurksDeveloperLondon532009/10/22$114,500
Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
Hope FuentesSecretarySan Francisco412010/02/12$109,850
Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
Timothy MooneyOffice ManagerLondon372008/12/11$136,200
Jackson BradshawDirectorNew York652008/09/26$645,750
Olivia LiangSupport EngineerSingapore642011/02/03$234,500
Bruno NashSoftware EngineerLondon382011/05/03$163,500
Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
Thor WaltonDeveloperNew York612013/08/11$98,540
Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
Cara StevensSales AssistantNew York462011/12/06$145,600
Hermione ButlerRegional DirectorLondon472011/03/21$356,250
Lael GreerSystems AdministratorLondon212009/02/27$103,500
Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
Donna SniderCustomer SupportNew York272011/01/25$112,000
+
+
+
+
+
+
+
+
+
ADD ROWS
+
+ + + +
+
+
+
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + +
Column 1Column 2Column 3Column 4Column 5
Column 1Column 2Column 3Column 4Column 5
+
+
+
+
+
+
+
+
+
MANAGED TABLE
+
+ + + +
+
+
+
+
+
+ +
+
+
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Username Email Status Joined Actions
+ + shuxer + shuxer@gmail.com + + Approved + 12 Jan 2012 +
+ + +
+
+ + looper + looper90@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + userwow + userwow@yahoo.com + + Approved + 12.12.2011 +
+ + +
+
+ + user1wow + userwow@gmail.com + + Blocked + 12.12.2011 +
+ + +
+
+ + restest + test@gmail.com + + Approved + 12.12.2011 +
+ + +
+
+ + foopl + good@gmail.com + + Info + 12.12.2011 +
+ + +
+
+ + weep + good@gmail.com + + Rejected + 12.12.2011 +
+ + +
+
+ + coop + good@gmail.com + + Info + 12.12.2011 +
+ + +
+
+ + pppol + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + test + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + userwow + userwow@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + test + test@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + goop + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + weep + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + toopl + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + userwow + userwow@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + tes21t + test@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + fop + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + kop + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + vopl + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + userwow + userwow@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + wap + test@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + test + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + toop + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+ + weep + good@gmail.com + + Suspended + 12.12.2011 +
+ + +
+
+
+
+
+
+
+
+
+
+
Table With State Save
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePositionOfficeAgeStart dateSalary
Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
Garrett WintersAccountantTokyo632011/07/25$170,750
Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
Airi SatouAccountantTokyo332008/11/28$162,700
Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
Jena GainesOffice ManagerLondon302008/12/19$90,560
Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
Michael SilvaMarketing DesignerLondon662012/11/27$198,500
Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
Gloria LittleSystems AdministratorNew York592009/04/10$237,500
Bradley GreerSoftware EngineerLondon412012/10/13$132,000
Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
Caesar VancePre-Sales SupportNew York212011/12/12$106,450
Doris WilderSales AssistantSidney232010/09/20$85,600
Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
Shou ItouRegional MarketingTokyo202011/08/14$163,000
Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
Suki BurksDeveloperLondon532009/10/22$114,500
Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
Hope FuentesSecretarySan Francisco412010/02/12$109,850
Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
Timothy MooneyOffice ManagerLondon372008/12/11$136,200
Jackson BradshawDirectorNew York652008/09/26$645,750
Olivia LiangSupport EngineerSingapore642011/02/03$234,500
Bruno NashSoftware EngineerLondon382011/05/03$163,500
Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
Thor WaltonDeveloperNew York612013/08/11$98,540
Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
Cara StevensSales AssistantNew York462011/12/06$145,600
Hermione ButlerRegional DirectorLondon472011/03/21$356,250
Lael GreerSystems AdministratorLondon212009/02/27$103,500
Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
Donna SniderCustomer SupportNew York272011/01/25$112,000
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/all_doctors.html b/application/views/admin/all_doctors.html new file mode 100644 index 0000000..15a8d07 --- /dev/null +++ b/application/views/admin/all_doctors.html @@ -0,0 +1,1904 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Doctor List
+
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name Department Specialization Degree Mobile Email Joining Date Action
+ + Dr.RajeshGeneral surgery18MBBS,MD + 4444565756 + rajesh@gmail.com 22 Feb 2000 + + + + +
+ + Dr.Pooja PatelCardiology5M.D. + 444786876 + pooja@gmail.com 27 Aug 2005 + + + + +
+ + Dr.Sarah SmithAnaesthetics15MBBS,DGO,MD + 44455546456 + sarah@gmail.com 05 Jun 2011 + + + + +
+ + Dr.John DeoDentist23BDS,MDS + 444543564 + john@gmail.com 15 Feb 2012 + + + + +
+ + Dr.Jay SoniGeneral10BHMS + 444543564 + kenh@gmail.com 12 Nov 2012 + + + + +
+ + Dr.Jacob RyanUrology14MBBS,MS + 444543564 + johnson@gmail.com 03 Dec 2001 + + + + +
+ + Dr.Megha TrivediGynaecology7MBBS,MS + 444543564 + megha@gmail.com 17 Mar 2013 + + + + +
+ + Dr.RajeshGeneral surgery18MBBS,MD + 4444565756 + rajesh@gmail.com 22 Feb 2000 + + + + +
+ + Dr.Pooja PatelCardiology5M.D. + 444786876 + pooja@gmail.com 27 Aug 2005 + + + + + + +
+ + Dr.Sarah SmithAnaesthetics15MBBS,DGO,MD + 44455546456 + sarah@gmail.com 05 Jun 2011 + + + + + + +
+ + Dr.John DeoDentist23BDS,MDS + 444543564 + john@gmail.com 15 Feb 2012 + + + + + + +
+ + Dr.Jay SoniGeneral10BHMS + 444543564 + kenh@gmail.com 12 Nov 2012 + + + + + + +
+ + Dr.Jacob RyanUrology14MBBS,MS + 444543564 + johnson@gmail.com 03 Dec 2001 + + + + + + +
+ + Dr.Megha TrivediGynaecology7MBBS,MS + 444543564 + megha@gmail.com 17 Mar 2013 + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
Dr.Pooja Patel
+
Cardiology
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Dr.Rajesh
+
General surgery
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Dr.Sarah Smith
+
Anaesthetics
+
+

456, Estern evenue, Courtage area,
New York

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+ +
+
Dr.John Deo
+
Dentist
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Dr.Jay Soni
+
General Physician
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Dr.Jacob Ryan
+
Urology
+
+

456, Estern evenue, Courtage area,
New York

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+ +
+
Dr.Megha Trivedi
+
Gynaecology
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Dr.Rajesh
+
General surgery
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Dr.Sarah Smith
+
Anaesthetics
+
+

456, Estern evenue, Courtage area,
New York

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+ +
+
Dr.Pooja Patel
+
Cardiology
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Dr.Rajesh
+
General surgery
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Dr.John Deo
+
Dentist
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/all_patients.html b/application/views/admin/all_patients.html new file mode 100644 index 0000000..4df9707 --- /dev/null +++ b/application/views/admin/all_patients.html @@ -0,0 +1,1887 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Patients List
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name Sex Address Mobile Birth Date AgeBlood GroupStatus Action
+ + RajeshMale18,Ajay flats, satadhar, ahmedabad + 4444565756 11 Jan 198327AB++Discharge + + + + + + +
+ + Pooja PatelFemale18,Ajay flats, satadhar, ahmedabad + 444786876 18 Jan 198323O+Operation + + + + + + +
+ + Sarah SmithFeale18,Ajay flats, satadhar, ahmedabad + 44455546456 22 Jan 198727O+Operation + + + + + + +
+ + John DeoMale18,Ajay flats, satadhar, ahmedabad + 444543564 11 Jan 198323A+Discharge + + + + + + +
+ + Jay SoniMale18,Ajay flats, satadhar, ahmedabad + 444543564 22 Jan 198727O+Check up + + + + + + +
+ + Jacob RyanMale18,Ajay flats, satadhar, ahmedabad + 444543564 22 Jan 198723AB-Check up + + + + + + +
+ + Megha TrivediFemale18,Ajay flats, satadhar, ahmedabad + 444543564 11 Jan 198327O+Operation + + + + + + +
+ + RajeshMale18,Ajay flats, satadhar, ahmedabad + 4444565756 09 Jan 198523A+Check up + + + + + + +
+ + Pooja PatelFemale18,Ajay flats, satadhar, ahmedabad + 444786876 22 Jan 198729O+Operation + + + + + + +
+ + Sarah SmithFemale18,Ajay flats, satadhar, ahmedabad + 44455546456 11 Jan 198329A-Check up + + + + + + +
+ + John DeoMale18,Ajay flats, satadhar, ahmedabad + 444543564 17 Jan 199223O+Discharge + + + + + + +
+ + Jay SoniMale18,Ajay flats, satadhar, ahmedabad + 444543564 22 Jan 198723A+Check up + + + + + + +
+ + Jacob RyanMale18,Ajay flats, satadhar, ahmedabad + 444543564 17 Jan 199229O+Operation + + + + + + +
+ + Megha TrivediFemale18,Ajay flats, satadhar, ahmedabad + 444543564 22 Jan 198723AB+Operation + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
Pooja Patel
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Rajesh
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Sarah Smith
+
+

456, Estern evenue, Courtage area,
New York

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+ +
+
John Deo
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Jay Soni
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Jacob Ryan
+
+

456, Estern evenue, Courtage area,
New York

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+ +
+
Megha Trivedi
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Rajesh
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Sarah Smith
+
Anaesthetics
+
+

456, Estern evenue, Courtage area,
New York

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+ +
+
Pooja Patel
+
Cardiology
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Rajesh
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
John Deo
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/all_staffs.html b/application/views/admin/all_staffs.html new file mode 100644 index 0000000..9118b0c --- /dev/null +++ b/application/views/admin/all_staffs.html @@ -0,0 +1,1902 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
All Staff
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name Designation Mobile Email Address Joining Date Action
+ + RajeshCompounder + 4444565756 + rajesh@gmail.com 22,tilak appt. surat22 Feb 2000 + + + + + + +
+ + Pooja PatelNurse + 444786876 + pooja@gmail.com 22,tilak appt. surat27 Aug 2005 + + + + + + +
+ + Sarah SmithNurse + 44455546456 + sarah@gmail.com 22,tilak appt. surat05 Jun 2011 + + + + + + +
+ + John DeoSupervisor + 444543564 + john@gmail.com 22,tilak appt. surat15 Feb 2012 + + + + + + +
+ + Jay SoniPurchase Officer + 444543564 + kenh@gmail.com 22,tilak appt. surat12 Nov 2012 + + + + + + +
+ + Jacob RyanReceptionist + 444543564 + johnson@gmail.com 22,tilak appt. surat03 Dec 2001 + + + + + + +
+ + Megha TrivediNurse + 444543564 + megha@gmail.com 22,tilak appt. surat17 Mar 2013 + + + + + + +
+ + RajeshLab Assistent + 4444565756 + rajesh@gmail.com 22,tilak appt. surat22 Feb 2000 + + + + + + +
+ + Pooja PatelPharmacist + 444786876 + pooja@gmail.com 22,tilak appt. surat27 Aug 2005 + + + + + + +
+ + Sarah SmithNurse + 44455546456 + sarah@gmail.com 22,tilak appt. surat05 Jun 2011 + + + + + + +
+ + Jacob RyanReceptionist + 444543564 + johnson@gmail.com 22,tilak appt. surat03 Dec 2001 + + + + + + +
+ + Megha TrivediNurse + 444543564 + megha@gmail.com 22,tilak appt. surat17 Mar 2013 + + + + + + +
+ + RajeshLab Assistent + 4444565756 + rajesh@gmail.com 22,tilak appt. surat22 Feb 2000 + + + + + + +
+ + Pooja PatelPharmacist + 444786876 + pooja@gmail.com 22,tilak appt. surat27 Aug 2005 + + + + + + +
+ + Sarah SmithNurse + 44455546456 + sarah@gmail.com 22,tilak appt. surat05 Jun 2011 + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
Pooja Patel
+
Nurse
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Rajesh
+
Compounder
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Sarah Smith
+
Nurse
+
+

456, Estern evenue, Courtage area,
New York

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+ +
+
John Deo
+
Supervisor
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Jay Soni
+
Purchase Officer
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Jacob Ryan
+
Receptionist
+
+

456, Estern evenue, Courtage area,
New York

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+ +
+
Megha Trivedi
+
Nurse
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Rajesh
+
Lab Assistent
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Sarah Smith
+
Nurse
+
+

456, Estern evenue, Courtage area,
New York

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+ +
+
Pooja Patel
+
Pharmacist
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
Rajesh
+
Compounder
+
+

45, Krishna Tower, Near Bus Stop, Satellite,
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+ +
+
John Deo
+
Supervisor
+
+

A-103, shyam gokul flats, Mahatma Road
Mumbai

+ +
+ Read More +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/basic_table.html b/application/views/admin/basic_table.html new file mode 100644 index 0000000..d831717 --- /dev/null +++ b/application/views/admin/basic_table.html @@ -0,0 +1,1815 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Basic Tables
+
+ +
+
+
+
+
+
+
+
+
BASIC TABLE
+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#First NameLast NameUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larrythe Bird@twitter
4Johnsmith@twitter
+
+
+
+
+
+
+
+
BORDER TABLE
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#First NameLast NameUsername
1MarkOtto@mdo
MarkOtto@TwBootstrap
2JacobThornton@fat
3Larry the Bird@twitter
+
+
+
+
+
+
+
+
+
+
+
+
+
STRIPED TABLE
+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
# First Name Last Name Username
1 Mark Otto makr124
2 Jacob Nilson jac123
3 Larry Cooper lar
4 Sandy Lim sanlim
5 Mark Otto makr124
6 Jacob Nilson jac123
7 Larry Cooper lar
8 Sandy Lim sanlim
9 Jacob Nilson jac123
+
+
+
+
+
+
+
+
CONTEXTUAL TABLE
+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#Column headingColumn headingColumn heading
1Column contentColumn contentColumn content
2Column contentColumn contentColumn content
3Column contentColumn contentColumn content
4Column contentColumn contentColumn content
5Column contentColumn contentColumn content
6Column contentColumn contentColumn content
7Column contentColumn contentColumn content
8Column contentColumn contentColumn content
9Column contentColumn contentColumn content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
STRIPED TABLE
+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CompanyDescritionProfitProgressStatusAction
VectorLab + Lorem Ipsum dorolo imit693030.00$ +
+
+
+
Due + + + + +
Admin Lab + Lorem Ipsum dorolo10003.00$ +
+
+
+
Due + + + + +
Metro Lab + Lorem Ipsum dorolo23400.00$ +
+
+
+
Paid + + + + +
Flat Lab + Lorem Ipsum dorolo36342.50$ +
+
+
+
Paid + + + + +
Slick Lab + Lorem Ipsum dorolo imit4022.00$ +
+
+
+
Due + + + + +
TroCode + Lorem Ipsum dorolo526456.00$ +
+
+
+
Due + + + + +
Vector Ltd + Lorem Ipsum dorolo imit12120.00$ +
+
+
+
Due + + + + +
Dashboard + Lorem Ipsum dorolo56456.00$ +
+
+
+
Due + + + + +
Vector Ltd + Lorem Ipsum dorolo imit12120.00$ +
+
+
+
Due + + + + +
Modern + Lorem Ipsum dorolo56456.00$ +
+
+
+
Due + + + + +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/blank_page.html b/application/views/admin/blank_page.html new file mode 100644 index 0000000..aa0fd4b --- /dev/null +++ b/application/views/admin/blank_page.html @@ -0,0 +1,1253 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Blank page
+
+ +
+
+ +
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/blog/add.php b/application/views/admin/blog/add.php new file mode 100644 index 0000000..41058b5 --- /dev/null +++ b/application/views/admin/blog/add.php @@ -0,0 +1,118 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Blog Add
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Add Blog
+ +
+
+ +
+
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + \ No newline at end of file diff --git a/application/views/admin/blog/edit.php b/application/views/admin/blog/edit.php new file mode 100644 index 0000000..1c6a2f4 --- /dev/null +++ b/application/views/admin/blog/edit.php @@ -0,0 +1,132 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Blog Edit
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Edit Blog
+ +
+ num_rows()>0) + { + $s=$blo->row(); + $id=$s->id; + $name=$s->name; + $image=$s->image; + + $intro=$s->intro; + $tags=$s->tags; + + } + ?> +
+ +
+
+ + +
+
+ + + +
+
+
+ +
+ + +
+
+ + +
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + \ No newline at end of file diff --git a/application/views/admin/blog/list.php b/application/views/admin/blog/list.php new file mode 100644 index 0000000..5fe2d6b --- /dev/null +++ b/application/views/admin/blog/list.php @@ -0,0 +1,227 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Blog List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Blog
+ +
+
+
+ + + +
+
+ + + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($blo->result() as $s) + { + $id=$s->id; + $name=$s->name; + $tags=$s->tags; + $image=$s->image; + $intro=$s->intro; + $enable_disable=$s->status; + ?> + + + + + + + + + + + + + +
S no Name Image Details Tags Edit Action
+ + +

+ +
+ + + + + + +
+
+
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + diff --git a/application/views/admin/book_appointment.html b/application/views/admin/book_appointment.html new file mode 100644 index 0000000..95a84ec --- /dev/null +++ b/application/views/admin/book_appointment.html @@ -0,0 +1,1417 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Book Appointment
+
+ +
+
+
+
+
+
+
Book Appointment
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+
+
+
+ +
+
+ + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/book_appointment_material.html b/application/views/admin/book_appointment_material.html new file mode 100644 index 0000000..d86492b --- /dev/null +++ b/application/views/admin/book_appointment_material.html @@ -0,0 +1,1379 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Book Appointment Material
+
+ +
+
+
+
+
+
+
Personal Information
+
+
+
+
+ + +
    +
  • Male
  • +
  • Female
  • +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + + Mobile Number Required ! +
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
Appointment Details
+
+
+
+
+ + +
    +
  • Dr. Rajesh
  • +
  • Dr. Sarah Smith
  • +
  • Dr. John Deo
  • +
  • Dr. Jay Soni
  • +
  • Dr. Jacob Ryan
  • +
  • Dr. Megha Trivedi
  • +
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+ + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/calendar.html b/application/views/admin/calendar.html new file mode 100644 index 0000000..5bdceaa --- /dev/null +++ b/application/views/admin/calendar.html @@ -0,0 +1,1297 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Calendar
+
+ +
+
+
+
+
+
+
+
+ Calendar
+
+
+
+
+
+
+
+
+ Draggable Events
+
+
+
+ +
+ Add Event +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/category/add.php b/application/views/admin/category/add.php new file mode 100644 index 0000000..67717a3 --- /dev/null +++ b/application/views/admin/category/add.php @@ -0,0 +1,333 @@ + + + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Category Add
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Add Category
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+

Make Questions & Options

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

Needed Documents for this policy

+
+ + +
+ + + + + + + + + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/category/cataction.php b/application/views/admin/category/cataction.php new file mode 100644 index 0000000..58d5056 --- /dev/null +++ b/application/views/admin/category/cataction.php @@ -0,0 +1,75 @@ + +num_rows()>0) { + $rm=$cat->row(); + $cmp_id= $rm->id; + $cmp_name= $rm->name; + $icon= $rm->icon; + }?> + + 'form-horizontal','id'=>'form_add','enctype'=>"multipart/form-data"));?> +
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+ +
+
+ + +num_rows()>0) { + $rm=$cat->row(); + $cmp_id= $rm->id; + $cmp_name= $rm->name; + $icon= $rm->icon; + }?> + + 'form-horizontal','id'=>'form_add','enctype'=>"multipart/form-data"));?> +
+
+
+ +
+

Are you sure you want to delete this ?

+
+
+ + +
+
+ + +bassets/select2/css/select2.css" rel="stylesheet" type="text/css" /> + + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Category
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Edit Category
+ +
+ num_rows()>0) + { + $r=$cat->row(); + $catid=$r->id; + $catname=$r->name; + $icon=$r->icon; + $short_description=$r->short_description; + } + ?> +
+ + +
+
+ + +
+
+ + +
+ +
+
+
+ + +
+ num_rows()>0) + { + foreach($com->result() as $list) + { + $compare[]= $list->compare; + } + } + ?> +
+ + +
+
+
+

Needed Documents for this policy

+ num_rows()>0) + { + foreach($doc->result() as $lists) + { + $document[]= $lists->document; + } + } + ?> +
+ + +
+ +
+

Make Questions & Options

+ + num_rows()>0) + { $k=0; + foreach($quest->result() as $q){ + $primaryid=$q->id; + $question=$q->question; + $option_input_types=$q->option_input_type; + $options=$q->options; + ?> +
+ +
+
+ + +
+
+ +
+ checked="checked" > + +
+
+ checked="checked" > + +
+
+ checked="checked" > + +
+ +
+
+ +
+
+ +
+
+
+ + + +
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ +
+ + +
+
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + +
+ +
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+
+ + +
+
+ +
+
+
+
+
+
+ +
+
+ + + + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/category/list.php b/application/views/admin/category/list.php new file mode 100644 index 0000000..d3cc1eb --- /dev/null +++ b/application/views/admin/category/list.php @@ -0,0 +1,125 @@ +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Category List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Category
+ +
+
+ +
+ + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($cat->result() as $r) + { + $cmpid=$r->id; + $cmpname=$r->name; + $icon=$r->icon; + ?> + + + + + + + + + +
S no Name Icon Action
+ + + + + + + + + +
+
+
+
+
+
+
+ + + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + \ No newline at end of file diff --git a/application/views/admin/category/view.php b/application/views/admin/category/view.php new file mode 100644 index 0000000..19647c9 --- /dev/null +++ b/application/views/admin/category/view.php @@ -0,0 +1,124 @@ + + + +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Category
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
View Category
+ +
+ num_rows()>0) + { + $r=$cat->row(); + $catid=$r->id; + $catname=$r->name; + $icon=$r->icon; + $short_description=$r->short_description; + } + ?> + + +
+

+ +
+ +
+

Short Description

+

+ + +
+
+

Compariosion Fields

+ num_rows()>0) + { $i=1; + foreach($com->result() as $cd){ + $compare=$cd->compare; + $compare_name=$cd->compare_name; + ?> +

+ +
+
+

Document Details

+ num_rows()>0) + { $i=1; + foreach($doc->result() as $cd){ + $document=$cd->document; + $docname=$cd->docname; + ?> +

+ +
+
+

Questions & Options

+
+ num_rows()>0) + { $i=1; + foreach($quest->result() as $q){ + $question=$q->question; + $option_input_type=$q->option_input_type; + $options=$q->options; + ?> +
+
+ +

+
+ + +
+
+ + +
+ + + +
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + + \ No newline at end of file diff --git a/application/views/admin/charts_chartjs.html b/application/views/admin/charts_chartjs.html new file mode 100644 index 0000000..8c4d4a5 --- /dev/null +++ b/application/views/admin/charts_chartjs.html @@ -0,0 +1,1372 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
ChartJs
+
+ +
+
+ +
+
+
+
+
LINE CHART
+
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
PIE CHART
+
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
BAR CHART
+
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
POLAR AREA CHART
+
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
DOUGHNUT CHART
+
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
RADAR CHART
+
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/charts_echarts.html b/application/views/admin/charts_echarts.html new file mode 100644 index 0000000..77068b4 --- /dev/null +++ b/application/views/admin/charts_echarts.html @@ -0,0 +1,1454 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
eCharts
+
+ +
+
+ + +
+
+
+
+
BAR CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
LINE CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
SCATTER CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
CANDLE CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
PIE CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
PIE CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Beijing Chart
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Weekly Weather Chart
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Scatter Chart
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Candle Chart
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/charts_morris.html b/application/views/admin/charts_morris.html new file mode 100644 index 0000000..8576325 --- /dev/null +++ b/application/views/admin/charts_morris.html @@ -0,0 +1,1341 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Morris
+
+ +
+
+ + +
+
+
+
+
LINE CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
AREA CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
BAR CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
DONUT CHART
+
+ + + +
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/child_row_table.html b/application/views/admin/child_row_table.html new file mode 100644 index 0000000..5437d97 --- /dev/null +++ b/application/views/admin/child_row_table.html @@ -0,0 +1,1301 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Child Row Tables
+
+ +
+
+
+
+
+
+
Child Row Table
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+ + + + + + + + + + + + + + + + + + + +
NamePositionOfficeSalary
NamePositionOfficeSalary
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/company/cmpaction.php b/application/views/admin/company/cmpaction.php new file mode 100644 index 0000000..0f5d6c7 --- /dev/null +++ b/application/views/admin/company/cmpaction.php @@ -0,0 +1,76 @@ + +num_rows()>0) { + $rm=$cmp->row(); + $cmp_id= $rm->id; + $cmp_name= $rm->name; + $logo= $rm->logo; + }?> + + 'form-horizontal','id'=>'form_add','enctype'=>"multipart/form-data"));?> +
+
+
+
+
+
+ +
+
+
+
+
+
+ + +
+ +
+ +
+
+ + +num_rows()>0) { + $rm=$cmp->row(); + $cmp_id= $rm->id; + $cmp_name= $rm->name; + }?> + + 'form-horizontal','id'=>'form_add','enctype'=>"multipart/form-data"));?> +
+
+
+ +
+

Are you sure you want to delete this ?

+
+
+ + +
+
+ + +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Company List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Company
+ +
+
+ +
+ + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($cmp->result() as $r) + { + $cmpid=$r->id; + $cmpname=$r->name; + $logo=$r->logo; + ?> + + + + + + + + + +
S no Name Logo Action
+ + + + + + +
+
+
+
+
+
+
+ + +
+
+
+
+
+
Add Company
+ +
+
+ + +
+ + +
+
+ + +
+ + + + +
+
+
+
+
+ +
+
+
+
+ + +load->view('admin/includes/footer');?> + + \ No newline at end of file diff --git a/application/views/admin/contact.html b/application/views/admin/contact.html new file mode 100644 index 0000000..25ec7e3 --- /dev/null +++ b/application/views/admin/contact.html @@ -0,0 +1,1329 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Contact Us
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+

Send us a Message

+

The clean and well commented code allows easy customization of the + theme.It's
designed for describing your app, agency or business.

+
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+
+
+
+
+
+
+
+ + + A-304, Shyam appartment, + Mahatma Gandhi Marg, + Satellite + +
+
+ + + (123)456-789-123 + +
+ +
+
+
+
+
+ +
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/dashboard-completed.php b/application/views/admin/dashboard-completed.php new file mode 100644 index 0000000..1ea173c --- /dev/null +++ b/application/views/admin/dashboard-completed.php @@ -0,0 +1,254 @@ +load->view('admin/includes/header');?> + + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Dashboard
+
+ +
+
+ load->view('admin/includes/msg');?> + +
+
+ num_rows()>0){ + $q=$quo->row(); + $get_quotes=$q->quotecount; + } ?> + + + num_rows()>0){ + $r=$req->row(); + $requestcount=$r->requestcount; + } ?> + + + num_rows()>0){ + + $responsecount=$res->num_rows(); + } ?> + + + + + + num_rows()>0){ + $o=$ongo->row(); + $oncount=$o->oncount; + } ?> + + + num_rows()>0){ + $c=$com->row(); + $comcount=$c->comcount; + } ?> + + +
+
+ +
+
+
+
+
Received Quotes
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($quo_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date
+
+
+
+
+
+ + +
+
+ + + +
+ + load->view('admin/includes/footer');?> + \ No newline at end of file diff --git a/application/views/admin/dashboard-not-response.php b/application/views/admin/dashboard-not-response.php new file mode 100644 index 0000000..1ea173c --- /dev/null +++ b/application/views/admin/dashboard-not-response.php @@ -0,0 +1,254 @@ +load->view('admin/includes/header');?> + + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Dashboard
+
+ +
+
+ load->view('admin/includes/msg');?> + +
+
+ num_rows()>0){ + $q=$quo->row(); + $get_quotes=$q->quotecount; + } ?> + + + num_rows()>0){ + $r=$req->row(); + $requestcount=$r->requestcount; + } ?> + + + num_rows()>0){ + + $responsecount=$res->num_rows(); + } ?> + + + + + + num_rows()>0){ + $o=$ongo->row(); + $oncount=$o->oncount; + } ?> + + + num_rows()>0){ + $c=$com->row(); + $comcount=$c->comcount; + } ?> + + +
+
+ +
+
+
+
+
Received Quotes
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($quo_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date
+
+
+
+
+
+ + +
+
+ + + +
+ + load->view('admin/includes/footer');?> + \ No newline at end of file diff --git a/application/views/admin/dashboard-onboard.php b/application/views/admin/dashboard-onboard.php new file mode 100644 index 0000000..1ea173c --- /dev/null +++ b/application/views/admin/dashboard-onboard.php @@ -0,0 +1,254 @@ +load->view('admin/includes/header');?> + + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Dashboard
+
+ +
+
+ load->view('admin/includes/msg');?> + +
+
+ num_rows()>0){ + $q=$quo->row(); + $get_quotes=$q->quotecount; + } ?> + + + num_rows()>0){ + $r=$req->row(); + $requestcount=$r->requestcount; + } ?> + + + num_rows()>0){ + + $responsecount=$res->num_rows(); + } ?> + + + + + + num_rows()>0){ + $o=$ongo->row(); + $oncount=$o->oncount; + } ?> + + + num_rows()>0){ + $c=$com->row(); + $comcount=$c->comcount; + } ?> + + +
+
+ +
+
+
+
+
Received Quotes
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($quo_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date
+
+
+
+
+
+ + +
+
+ + + +
+ + load->view('admin/includes/footer');?> + \ No newline at end of file diff --git a/application/views/admin/dashboard-request.php b/application/views/admin/dashboard-request.php new file mode 100644 index 0000000..1ea173c --- /dev/null +++ b/application/views/admin/dashboard-request.php @@ -0,0 +1,254 @@ +load->view('admin/includes/header');?> + + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Dashboard
+
+ +
+
+ load->view('admin/includes/msg');?> + +
+
+ num_rows()>0){ + $q=$quo->row(); + $get_quotes=$q->quotecount; + } ?> + + + num_rows()>0){ + $r=$req->row(); + $requestcount=$r->requestcount; + } ?> + + + num_rows()>0){ + + $responsecount=$res->num_rows(); + } ?> + + + + + + num_rows()>0){ + $o=$ongo->row(); + $oncount=$o->oncount; + } ?> + + + num_rows()>0){ + $c=$com->row(); + $comcount=$c->comcount; + } ?> + + +
+
+ +
+
+
+
+
Received Quotes
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($quo_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date
+
+
+
+
+
+ + +
+
+ + + +
+ + load->view('admin/includes/footer');?> + \ No newline at end of file diff --git a/application/views/admin/dashboard-response.php b/application/views/admin/dashboard-response.php new file mode 100644 index 0000000..1ea173c --- /dev/null +++ b/application/views/admin/dashboard-response.php @@ -0,0 +1,254 @@ +load->view('admin/includes/header');?> + + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Dashboard
+
+ +
+
+ load->view('admin/includes/msg');?> + +
+
+ num_rows()>0){ + $q=$quo->row(); + $get_quotes=$q->quotecount; + } ?> + + + num_rows()>0){ + $r=$req->row(); + $requestcount=$r->requestcount; + } ?> + + + num_rows()>0){ + + $responsecount=$res->num_rows(); + } ?> + + + + + + num_rows()>0){ + $o=$ongo->row(); + $oncount=$o->oncount; + } ?> + + + num_rows()>0){ + $c=$com->row(); + $comcount=$c->comcount; + } ?> + + +
+
+ +
+
+
+
+
Received Quotes
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($quo_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date
+
+
+
+
+
+ + +
+
+ + + +
+ + load->view('admin/includes/footer');?> + \ No newline at end of file diff --git a/application/views/admin/dashboard.php b/application/views/admin/dashboard.php new file mode 100644 index 0000000..f212582 --- /dev/null +++ b/application/views/admin/dashboard.php @@ -0,0 +1,751 @@ +load->view('admin/includes/header'); +$seg=$this->uri->segment(2);?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Dashboard
+
+ +
+
+ load->view('admin/includes/msg');?> + +
+
+ num_rows()>0){ + $q=$quo->row(); + $get_quotes=$q->quotecount; + } ?> + + + num_rows()>0){ + $r=$req->row(); + $requestcount=$r->requestcount; + } ?> + + + num_rows()>0){ + + $responsecount=$res->num_rows(); + } ?> + + + + + + num_rows()>0){ + $o=$ongo->row(); + $oncount=$o->oncount; + } ?> + + + num_rows()>0){ + $c=$com->row(); + $comcount=$c->comcount; + } ?> + + +
+
+ +
+
+ +
+
+
Received Quotes
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($quo_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date
+
+
+
+
+ + +
+
+
Open Requests
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($req_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date
+
+
+
+
+ + +
+
+
Responsed Quotes
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($res_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + $res_mobile=$gq->mobile; + $res_email=$gq->email; + $res_message=$gq->message; + + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date Response
Mobile :
+ Email :
+ Message : + +
+
+
+
+
+ + +
+
+
Ongoing Quotes
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($on_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date Status
+
+ +
+ +
+ +
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+ + +
+
+
Completed Quotes
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($com_det->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date
+
+
+
+
+ +
+ + +
+
+ + + +
+ + load->view('admin/includes/footer');?> + \ No newline at end of file diff --git a/application/views/admin/dashboard2.html b/application/views/admin/dashboard2.html new file mode 100644 index 0000000..e9fc250 --- /dev/null +++ b/application/views/admin/dashboard2.html @@ -0,0 +1,1522 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Dashboard
+
+ +
+
+ +
+
+
+
+
+
+

New Patients

+
+
+
+ 14% higher than last month +
+
+
+
+
+
+

OPD Patients

+
+
+
+ 7% higher than last month +
+
+
+
+
+
+

Today's Operations

+
+
+
+ 34% higher than last month +
+
+
+
+
+
+

Visitors

+
+
+
+ 20% higher than last month +
+
+
+
+
+
+
+
+
HOSPITAL SURVEY
+
+ + + +
+
+
+
+ +
+
+
+
+
+ +
+
+
+

25% High + then last month NEW PATIENT

+
+
+
Overall Growth
35.80% +
+
+
Montly
45.20% +
+
+
Day
5.50% +
+
+
+
+
+
+
+

30% Low then + last monthHEART SURGERIES

+
+
+
Overall Growth
20.60% +
+
+
Montly
65.30% +
+
+
Day
4.90% +
+
+
+
+
+
+
+

20% High + then last monthMEDICAL TREATMENT

+
+
+
Overall Growth
38.40% +
+
+
Montly
52.49% +
+
+
Day
4.70% +
+
+
+
+
+
+ +
+
+
+
+
ADMIT PATIENT LIST
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NoNameAssigned DoctorDate Of AdmitDiseasesRoom NoEdit
1Jens BrinckerDr.Kenny Josh27/05/2016 + Influenza + 101 +
2Mark HayDr. Mark26/05/2017 + Cholera + 105 +
3Anthony DavieDr.Cinnabar21/05/2016 + Amoebiasis + 106 +
4David PerryDr.Felix 20/04/2016 + Jaundice + 105 +
5Anthony DavieDr.Beryl24/05/2016 + Leptospirosis + 102 +
6Alan GilchristDr.Joshep22/05/2016 + Hepatitis + 103 +
7Mark HayDr.Jayesh18/06/2016 + Typhoid + 107 +
8Sue WoodgerDr.Sharma17/05/2016 + Malaria + 108 +
+
+
+
+
+
+
+ +
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/dashboard3.html b/application/views/admin/dashboard3.html new file mode 100644 index 0000000..5ffd60a --- /dev/null +++ b/application/views/admin/dashboard3.html @@ -0,0 +1,1855 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Dashboard
+
+ +
+
+ +
+
+
+

Appointments 345

+
+
+
+
+
+

New Patients 643

+
+
+
+
+
+

Today's OPD 765

+
+
+
+
+
+

Visitors 323

+
+
+
+
+ + +
+
+
+
+
HOSPITAL SURVEY
+
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
HOSPITAL SURVEY
+
+ + + +
+
+
+
+ +
+
+
+
+
+ + +
+
+
+
+
NEW PATIENT LIST
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NoNameAssigned DoctorDiseasesRoom No
1Jens BrinckerDr.Kenny Josh + Influenza + 101
2Mark HayDr. Mark + Cholera + 105
4David PerryDr.Felix + Jaundice + 105
5Anthony DavieDr.Beryl + Leptospirosis + 102
7Mark HayDr.Jayesh + Typhoid + 107
8Sue WoodgerDr.Sharma + Malaria + 108
+
+
+
+
+
+
+
+
+
TODO LIST
+
+ + + +
+
+
+
+
    +
  • +
    + + +
    +

    UI perfection testing for Mega Section +

    +
    + +
    +
  • +
  • +
    + + +
    +

    UI perfection testing for Mega Section +

    +
    + +
    +
  • +
  • +
    + + +
    +

    Wiget & Design placement

    +
    + +
    +
  • +
  • +
    + + +
    +

    Development & Wiget placement +

    +
    + +
    +
  • +
  • +
    + + +
    +

    Test Complete +

    +
    + +
    +
  • +
+
+ +
+
+
+
+ +
+
+
+
+
Booked Appointment List
+
+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Patient NameAssigned DoctorDateTimeActions
+ + Jayesh Patel + Dr.Rajesh + 12/05/2016 10:45 +
+ + +
+
+ + Pooja Patel + Dr.Sarah Smith + 12/05/2016 10:55 +
+ + +
+
+ + Pankaj Singh + Dr.Rajesh + 12/05/2016 11:15 +
+ + +
+
+ + Raj Malhotra + Dr.Megha Trivedi + 12/05/2016 11:25 +
+ + +
+
+ + Sneha Pandya + Dr.Sarah Smith + 12/05/2016 11:35 +
+ + +
+
+ + Sameer Jain + Dr.Megha Trivedi + 12/05/2016 11:45 +
+ + +
+
+
+
+
+
+
+
+
+
Doctors List
+
+
+
+
    +
  • +
    + +
    +
    +
    + Dr.Rajesh -(MBBS,MD) +
    +
    + Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Sarah Smith -(MBBS,MD) +
    +
    + Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.John Deo - (BDS,MDS) +
    +
    + Not Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Jay Soni - (BHMS) +
    +
    + On Leave +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Jacob Ryan - (MBBS,MS) +
    +
    + Not Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Megha Trivedi - (MBBS,MS) +
    +
    + Available +
    +
    +
  • +
+
+ View all +
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/doctor_profile.html b/application/views/admin/doctor_profile.html new file mode 100644 index 0000000..31f87ae --- /dev/null +++ b/application/views/admin/doctor_profile.html @@ -0,0 +1,1585 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + + +
+
+
+
+
+
Doctor Profile
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
Dr.Kiran Patel
+
Gynaecologist
+
+ + + +
+ + +
+ +
+
+
+
+
About Me
+
+
+
+ Hello I am Kiran Patel a Gynaecologist in Sanjivni Hospital Surat. I love to work with all my hospital staff + and seniour doctors. +
+
    +
  • + Gender +
    Female
    +
  • +
  • + Operation Done +
    30+
    +
  • +
  • + Degree +
    MBBS,MD
    +
  • +
  • + Designation +
    Gynaecologist
    +
  • +
+
+
+
37
+
Projects
+
+
+
51
+
Tasks
+
+
+
61
+
Uploads
+
+
+
+
+
+
+
Address
+
+
+
+
+

456, Pragri flat, varacha road, Surat +
Gujarat, India.

+
+
+
+
+
+
+
Work Progress
+
+
+
+
+
+
OPD
+
50%
+
+
+
+ 50% +
+
+
+
+
+
Operations
+
85%
+
+
+
+ 85% +
+
+
+
+
+
Patient visit
+
20%
+
+
+
+ 20% +
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ +
+ +
+ +
+
+
+
+
Full Name +
+

Dr.Kiran Patel

+
+
Mobile +
+

(123) 456 7890

+
+
Email +
+

kiranpatel@sanjivnee.com

+
+
Location +
+

India

+
+
+
+

Completed my graduation in Gynaecologist Medicine from the well known and renowned + institution of India – SARDAR PATEL MEDICAL COLLEGE, BARODA in 2000-01, which was affiliated to M.S. + University. I ranker in University exams from the same university from 1996-01.

+

Worked as Professor and Head of the department ; Community medicine Department at Sterline Hospital, + Rajkot, Gujarat from 2003-2015

+

And I was lucky to train in a collegial environment where we called most of our attendings by their + first names. If only doctors did it that way outside the Midwest. One of my attendings even made the + argument that it is safer for patient care because it’s easier for subordinates to raise concerns when + they’re not verbally kowtowing to their superior. I never respected a white-haired surgeon any less when + I addressed him by his first name. In fact, I saw that in non-clinical science, it is commonplace for + the most junior researchers to call the most celebrated senior scientists by their first names.

+

When I offer or recommend products, I do so because I have actively researched them and find they are + the best in that category for your health. I ignore substandard products, and products not directly + pertinent to your health, regardless of any potential financial upsid

+
+

Education

+
+
    +
  • M.B.B.S.,Gujarat University, Ahmedabad,India.
  • +
  • M.S.,Gujarat University, Ahmedabad, India.
  • +
  • SPINAL FELLOWSHIP Dr. John Adam, Allegimeines Krakenhaus, Schwerin, Germany.
  • +
  • Fellowship in Endoscopic Spine Surgery Phoenix, USA.
  • +
  • D.N.B from AIIMS
  • +
+
+

Experience

+
+
    +
  • One year rotatory internship from April-2009 to march-2010 at B. J. Medical College, Ahmedabad.
  • +
  • Three year residency at V.S. General Hospital as a resident in orthopedics from April - 2008 to + April - 2011.
  • +
  • I have worked as a part time physiotherapist in Apang manav mandal from 1st june 2004 to 31st jan + 2005.
  • +
  • Clinical and Research fellowship in Scoliosis at Shaurashtra University and Medical Centre (KUMC) , + Krishna Hospital , Rajkot from April 2013 to June 2013.
  • +
  • 2.5 Years Worked at Mahatma Gandhi General Hospital, Surendranagar.
  • +
  • Consultant Orthopedics Surgeon Jalna 2 years.
  • +
+
+

Conferences, Cources & Workshop Attended

+
+
    +
  • 3 days conference of Indian Orthopedics Association (IOACON) held in December 2001 in Ahmedabad, + Gujarat.
  • +
  • 4th Annual Karnataka state physiotherapy students conference
  • +
  • 3 day conference of Association of Spine Surgeons of India(ASSICON) held in Jan 2007 in Ahmedabad, + India.
  • +
  • 16th Annual Conference GOACON ' 98 Ahmedabad CME 6th February, 1998
  • +
  • 5 day conference of Indian Orthopedic Association (IOACON) held in Dec.2005 in Mumbai, India.
  • +
  • Indian Medical Association Kapadwanj C.M.E. on 22nd April, 2004.
  • +
  • Post Graduate lecture course for Gujarat Orthopaedic Association Ahmedabad 6th to 7th August, 2005.
  • +
+
+

Professional Affiliations

+
+
    +
  • Life member: Association of Spine Surgeons’ of India.
  • +
  • Life member: Gujarat Orthopaedic Association.
  • +
  • Life Member: The Indian Society for Bone and Mineral Research (ISBMR).
  • +
  • Life member: Ahmedabad Orthopaedic Society
  • +
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+
+
+
    +
  • +
    + +
    +
    +
    Rajesh Uploaded 3 new photos
    +

    7 minutes ago near Alaska, USA

    + +
    +
  • +
  • +
    + +
    +
    +
    John Doe attended a meeting with + Lina Smith.
    +

    2 days ago near Alaska, USA

    +
    +
  • +
  • +
    + +
    +
    +
    Kehn Anderson completed the task “wireframe design” within the dead line
    +

    4 days ago near Alaska, USA

    +
    +
  • +
  • +
    + +
    +
    +
    Jacob Ryan was absent office due to sickness
    +

    4 days ago near Alaska, USA

    +
    +
  • +
+
+
+
+
+
+
+
+
+
+ +
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/edit_appointment.html b/application/views/admin/edit_appointment.html new file mode 100644 index 0000000..6c43764 --- /dev/null +++ b/application/views/admin/edit_appointment.html @@ -0,0 +1,1422 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Edit Appointment
+
+ +
+
+
+
+
+
+
Edit Appointment
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+
+ + + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/edit_doctor.html b/application/views/admin/edit_doctor.html new file mode 100644 index 0000000..ecb78ac --- /dev/null +++ b/application/views/admin/edit_doctor.html @@ -0,0 +1,1411 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Edit Doctor
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/edit_patient.html b/application/views/admin/edit_patient.html new file mode 100644 index 0000000..738bda5 --- /dev/null +++ b/application/views/admin/edit_patient.html @@ -0,0 +1,1423 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Edit Patient
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+ + + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/edit_room_allotment.html b/application/views/admin/edit_room_allotment.html new file mode 100644 index 0000000..0da9400 --- /dev/null +++ b/application/views/admin/edit_room_allotment.html @@ -0,0 +1,1341 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Edit Room Allotment
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/edit_staff.html b/application/views/admin/edit_staff.html new file mode 100644 index 0000000..1b23f96 --- /dev/null +++ b/application/views/admin/edit_staff.html @@ -0,0 +1,1379 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Edit Staff
+
+ +
+
+
+
+
+
+
Basic Information
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+ +
+
+
+ +
+
+ + + + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/editable_form.html b/application/views/admin/editable_form.html new file mode 100644 index 0000000..4d01995 --- /dev/null +++ b/application/views/admin/editable_form.html @@ -0,0 +1,1320 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Form Editable
+
+ +
+
+
+
+ +
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/email_compose.html b/application/views/admin/email_compose.html new file mode 100644 index 0000000..442f20d --- /dev/null +++ b/application/views/admin/email_compose.html @@ -0,0 +1,1412 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
New Mail
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+ + +
+ Cc + Bcc +
+
+ + +
+ + +
+
+
+ +
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/email_inbox.html b/application/views/admin/email_inbox.html new file mode 100644 index 0000000..947ed5d --- /dev/null +++ b/application/views/admin/email_inbox.html @@ -0,0 +1,1894 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Inbox
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+ + +
+ + +
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + + + + Leena SmithJatin I found you on LinkedIn. + 10:27 AM
+
+ + +
+
+ + + + + Sarah SmithFwd: Important Notice Regarding Your Domain NameNov 15
+
+ + +
+
+ + + R + + Rakesh mahetapls take a print of attachmentsmay 11
+
+ + +
+
+ + + + + Kehn AndersonApply for Ortho Surgeonmay 01
+
+ + +
+
+ + + X + + XYZ bank Office + Transaction Alert from XYZ BankMay 23
+
+ + +
+
+ + + + + Sarah SmithFind web design and develomnent work + june 24
+
+ + +
+
+ + + V + + Viral ShahA big thank for the support + Jan 09
+
+ + +
+
+ + + + + Jennifer Maklen friends + (no subject)Mar 04
+
+ + +
+
+ + + + + Vlad CardellaProblem ListMar 13
+
+ + +
+
+ + + + + Rajesh family + you have 1 notificationMar 24
+
+ + +
+
+ + + + + Kehn AndersonPresenting WAF in Munich web weekMarch 09
+
+ + +
+
+ + + + + Anjelina CardellaRequest for leave application + july 10
+
+ + +
+
+ + + + + John DeoWeb framework presentation file + jan 18
+
+ + +
+
+ + + + + Leena SmithWedding Reception Invitationfeb 14
+
+ + +
+
+ + + + + Kehn AndersonYour Interview schedule....feb 17
+
+ + +
+
+ + + F + + FacebookRitu jani tagged you in a post on Facebook + mar 14
+
+ + +
+
+ + + + + John DeoAnd you thought you recycled everything you + could !Aug 10
+
+ + +
+
+ + + + + Jacob RyanPresenting WAF in Munich web week + Aug 14
+
+ + +
+
+ + + + + Jennifer MaklenApply for web developer + June 11
+
+ + +
+
+ + + + + Jeff Adempls take a print of attachmentsAug 15
+
+ + +
+
+ + + + + Anjelina CardellaFind web design and develomnent + work + April 19
+
+ + +
+
+ + + + + Vlad CardellaTransaction Alert from XYZ Bank + April 14
+
+ + +
+
+ + + + + Leena SmithJatin I found you on LinkedIn. + mar 26
+
+ + +
+
+ + + + + John DeoYou have 1 new messageAug 10
+
+ + +
+
+ + + + + Kehn AndersonMerry Christmas + dec 14
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/email_view.html b/application/views/admin/email_view.html new file mode 100644 index 0000000..bfa97cc --- /dev/null +++ b/application/views/admin/email_view.html @@ -0,0 +1,1442 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
View Mail
+
+ +
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+

Hi Dear, How are you?

+
+
+
+ + +
+ 4:15AM 04 April + 2014 +

Dr.Sarah Smith

+ From: + sarah@hospital.com +
+
+
+
+

Donec ultrices faucibus rutrum. Phasellus sodales vulputate urna, vel accumsan augue egestas ac. + Donec vitae leo at sem lobortis porttitor eu consequat risus. Mauris sed congue orci. Donec ultrices + faucibus rutrum. Phasellus sodales vulputate urna, vel accumsan augue egestas ac. Donec vitae leo at + sem lobortis porttitor eu consequat risus. Mauris sed congue orci. Donec ultrices faucibus rutrum. + Phasellus sodales vulputate urna, vel accumsan augue egestas ac. Donec vitae leo at sem lobortis + porttitor eu consequat risus. Mauris sed congue orci.

+

+ Porttitor eu consequat risus. Mauris sed + congue orci. Donec ultrices faucibus rutrum. Phasellus sodales vulputate urna, vel accumsan augue + egestas ac. Donec vitae leo at sem lobortis porttitor eu consequat risus. Mauris sed congue orci. + Donec ultrices faucibus rutrum. Phasellus sodales vulputate urna, vel accumsan augue egestas ac. Donec + vitae leo at sem lobortis porttitor eu consequat risus. Mauris sed congue orci. +

+

+ Sodales vulputate urna, vel accumsan augue + egestas ac. Donec vitae leo at sem lobortis porttitor eu consequat risus. Mauris sed congue orci. + Donec ultrices faucibus rutrum. Phasellus sodales vulputate urna, vel accumsan augue egestas ac. Donec + vitae leo at sem lobortis porttitor eu consequat risus. Mauris sed congue orci. +

+
+ +
+ Reply + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/export_table.html b/application/views/admin/export_table.html new file mode 100644 index 0000000..4ea6330 --- /dev/null +++ b/application/views/admin/export_table.html @@ -0,0 +1,1766 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Export Table
+
+ +
+
+
+
+
+
+
Export Table
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePositionOfficeAgeStart dateSalary
Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
Garrett WintersAccountantTokyo632011/07/25$170,750
Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
Airi SatouAccountantTokyo332008/11/28$162,700
Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
Jena GainesOffice ManagerLondon302008/12/19$90,560
Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
Michael SilvaMarketing DesignerLondon662012/11/27$198,500
Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
Gloria LittleSystems AdministratorNew York592009/04/10$237,500
Bradley GreerSoftware EngineerLondon412012/10/13$132,000
Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
Caesar VancePre-Sales SupportNew York212011/12/12$106,450
Doris WilderSales AssistantSidney232010/09/20$85,600
Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
Shou ItouRegional MarketingTokyo202011/08/14$163,000
Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
Suki BurksDeveloperLondon532009/10/22$114,500
Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
Hope FuentesSecretarySan Francisco412010/02/12$109,850
Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
Timothy MooneyOffice ManagerLondon372008/12/11$136,200
Jackson BradshawDirectorNew York652008/09/26$645,750
Olivia LiangSupport EngineerSingapore642011/02/03$234,500
Bruno NashSoftware EngineerLondon382011/05/03$163,500
Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
Thor WaltonDeveloperNew York612013/08/11$98,540
Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
Cara StevensSales AssistantNew York462011/12/06$145,600
Hermione ButlerRegional DirectorLondon472011/03/21$356,250
Lael GreerSystems AdministratorLondon212009/02/27$103,500
Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
Donna SniderCustomer SupportNew York272011/01/25$112,000
NamePositionOfficeAgeStart dateSalary
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/faq/add.php b/application/views/admin/faq/add.php new file mode 100644 index 0000000..88f5296 --- /dev/null +++ b/application/views/admin/faq/add.php @@ -0,0 +1,110 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
FAQ Add
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Add FAQ
+ +
+
+ + +
+ + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + \ No newline at end of file diff --git a/application/views/admin/faq/cmpaction.php b/application/views/admin/faq/cmpaction.php new file mode 100644 index 0000000..af0a4bd --- /dev/null +++ b/application/views/admin/faq/cmpaction.php @@ -0,0 +1,67 @@ + +num_rows()>0) { + $rm=$cmp->row(); + $cmp_id= $rm->id; + $cmp_name= $rm->name; + }?> + + 'form-horizontal','id'=>'form_add','enctype'=>"multipart/form-data"));?> +
+
+
+
+
+
+ +
+
+ + +
+
+ + +num_rows()>0) { + $rm=$cmp->row(); + $cmp_id= $rm->id; + $cmp_name= $rm->name; + }?> + + 'form-horizontal','id'=>'form_add','enctype'=>"multipart/form-data"));?> +
+
+
+ +
+

Are you sure you want to delete this ?

+
+
+ + +
+
+ + +bassets/jquery-tags-input/jquery-tags-input.css" rel="stylesheet"> +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
FAQ Edit
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Edit FAQ
+ +
+
+ num_rows()>0) + { + $s=$faq->row(); + $id=$s->id; + $question=$s->question; + $answer=$s->answer; + + + + }?> + + +
+ + +
+ + +
+
+ + +
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + \ No newline at end of file diff --git a/application/views/admin/faq/list.php b/application/views/admin/faq/list.php new file mode 100644 index 0000000..c4d9776 --- /dev/null +++ b/application/views/admin/faq/list.php @@ -0,0 +1,213 @@ +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
FAQ List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
FAQ
+ +
+
+
+ + + +
+
+ + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($faq->result() as $r) + { + $id=$r->id; + $question=$r->question; + $answer=$r->answer; + $status=$r->status; + ?> + + + + + + + + + + +
S no Question Answer Edit Action
+ + + + + + + +
+
+
+
+
+
+
+ + + + +
+
+
+
+ +load->view('admin/includes/footer');?> + + \ No newline at end of file diff --git a/application/views/admin/forgot_password.html b/application/views/admin/forgot_password.html new file mode 100644 index 0000000..428babc --- /dev/null +++ b/application/views/admin/forgot_password.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + +
+
+
+
+ + +

+ Forgot Your Password? Let Us Help You. +

+
+ + +
+
+ +
+ +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/google_maps.html b/application/views/admin/google_maps.html new file mode 100644 index 0000000..7ac91f0 --- /dev/null +++ b/application/views/admin/google_maps.html @@ -0,0 +1,1393 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Google Maps
+
+ +
+
+
+
+
+
+
Basic
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
Markers
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
Geolocation
+
+ + + +
+
+
+
Not supported in Internet Explorer 8
+
+
+
+
+
+
+
+
+
+
Polylines
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
Polygons
+
+ + + +
+
+
+
Not supported in Internet Explorer 8
+
+
+
+
+
+
+
+
+
+
Routes
+
+ + + +
+
+
+
+ +
+
Not supported in Internet Explorer 8
+
+
    +
+
+
+
+
+
+
+
+
+
Geocoding
+
+ + + +
+
+
+
+
+ + + + +
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/group_table.html b/application/views/admin/group_table.html new file mode 100644 index 0000000..bdeb9f4 --- /dev/null +++ b/application/views/admin/group_table.html @@ -0,0 +1,1746 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Table With Group
+
+ +
+
+
+
+
+
+
Row grouping
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePositionOfficeAgeStart dateSalary
Tiger NixonSystem ArchitectEdinburgh612011/04/25$320,800
Garrett WintersAccountantTokyo632011/07/25$170,750
Ashton CoxJunior Technical AuthorSan Francisco662009/01/12$86,000
Cedric KellySenior Javascript DeveloperEdinburgh222012/03/29$433,060
Airi SatouAccountantTokyo332008/11/28$162,700
Brielle WilliamsonIntegration SpecialistNew York612012/12/02$372,000
Herrod ChandlerSales AssistantSan Francisco592012/08/06$137,500
Rhona DavidsonIntegration SpecialistTokyo552010/10/14$327,900
Colleen HurstJavascript DeveloperSan Francisco392009/09/15$205,500
Sonya FrostSoftware EngineerEdinburgh232008/12/13$103,600
Jena GainesOffice ManagerLondon302008/12/19$90,560
Quinn FlynnSupport LeadEdinburgh222013/03/03$342,000
Charde MarshallRegional DirectorSan Francisco362008/10/16$470,600
Haley KennedySenior Marketing DesignerLondon432012/12/18$313,500
Tatyana FitzpatrickRegional DirectorLondon192010/03/17$385,750
Michael SilvaMarketing DesignerLondon662012/11/27$198,500
Paul ByrdChief Financial Officer (CFO)New York642010/06/09$725,000
Gloria LittleSystems AdministratorNew York592009/04/10$237,500
Bradley GreerSoftware EngineerLondon412012/10/13$132,000
Dai RiosPersonnel LeadEdinburgh352012/09/26$217,500
Jenette CaldwellDevelopment LeadNew York302011/09/03$345,000
Yuri BerryChief Marketing Officer (CMO)New York402009/06/25$675,000
Caesar VancePre-Sales SupportNew York212011/12/12$106,450
Doris WilderSales AssistantSidney232010/09/20$85,600
Angelica RamosChief Executive Officer (CEO)London472009/10/09$1,200,000
Gavin JoyceDeveloperEdinburgh422010/12/22$92,575
Jennifer ChangRegional DirectorSingapore282010/11/14$357,650
Brenden WagnerSoftware EngineerSan Francisco282011/06/07$206,850
Fiona GreenChief Operating Officer (COO)San Francisco482010/03/11$850,000
Shou ItouRegional MarketingTokyo202011/08/14$163,000
Michelle HouseIntegration SpecialistSidney372011/06/02$95,400
Suki BurksDeveloperLondon532009/10/22$114,500
Prescott BartlettTechnical AuthorLondon272011/05/07$145,000
Gavin CortezTeam LeaderSan Francisco222008/10/26$235,500
Martena MccrayPost-Sales supportEdinburgh462011/03/09$324,050
Unity ButlerMarketing DesignerSan Francisco472009/12/09$85,675
Howard HatfieldOffice ManagerSan Francisco512008/12/16$164,500
Hope FuentesSecretarySan Francisco412010/02/12$109,850
Vivian HarrellFinancial ControllerSan Francisco622009/02/14$452,500
Timothy MooneyOffice ManagerLondon372008/12/11$136,200
Jackson BradshawDirectorNew York652008/09/26$645,750
Olivia LiangSupport EngineerSingapore642011/02/03$234,500
Bruno NashSoftware EngineerLondon382011/05/03$163,500
Sakura YamamotoSupport EngineerTokyo372009/08/19$139,575
Thor WaltonDeveloperNew York612013/08/11$98,540
Finn CamachoSupport EngineerSan Francisco472009/07/07$87,500
Serge BaldwinData CoordinatorSingapore642012/04/09$138,575
Zenaida FrankSoftware EngineerNew York632010/01/04$125,250
Zorita SerranoSoftware EngineerSan Francisco562012/06/01$115,000
Jennifer AcostaJunior Javascript DeveloperEdinburgh432013/02/01$75,650
Cara StevensSales AssistantNew York462011/12/06$145,600
Hermione ButlerRegional DirectorLondon472011/03/21$356,250
Lael GreerSystems AdministratorLondon212009/02/27$103,500
Jonas AlexanderDeveloperSan Francisco302010/07/14$86,500
Shad DeckerRegional DirectorEdinburgh512008/11/13$183,000
Michael BruceJavascript DeveloperSingapore292011/06/27$183,000
Donna SniderCustomer SupportNew York272011/01/25$112,000
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/includes/footer.php b/application/views/admin/includes/footer.php new file mode 100644 index 0000000..957cb9d --- /dev/null +++ b/application/views/admin/includes/footer.php @@ -0,0 +1,44 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/application/views/admin/includes/header.php b/application/views/admin/includes/header.php new file mode 100644 index 0000000..669eb5c --- /dev/null +++ b/application/views/admin/includes/header.php @@ -0,0 +1,302 @@ + session->userdata('id'); +$username=$this->session->userdata('name'); +?> + + + + + + + + + Policybot | Admin Dashboard + + + + + + + + + + + + + + + + + + + + + + + + + + class="page-header-fixed sidemenu-closed-hidelogo page-content-white page-md header-white white-sidebar-color logo-indigo"> +
+ + + + \ No newline at end of file diff --git a/application/views/admin/includes/msg.php b/application/views/admin/includes/msg.php new file mode 100644 index 0000000..5ffa7a3 --- /dev/null +++ b/application/views/admin/includes/msg.php @@ -0,0 +1,11 @@ + session->userdata('suc')) { ?> + +session->userdata('err')) { ?> + + \ No newline at end of file diff --git a/application/views/admin/includes/sidebar.php b/application/views/admin/includes/sidebar.php new file mode 100644 index 0000000..dbd8b97 --- /dev/null +++ b/application/views/admin/includes/sidebar.php @@ -0,0 +1,92 @@ + +1,'parent_id'=>0); +$showField = array('*'); +$menus=$this->commonsql_model->selectTable($tableName, $whereData,$showField); +?> + + + \ No newline at end of file diff --git a/application/views/admin/index.html b/application/views/admin/index.html new file mode 100644 index 0000000..7026950 --- /dev/null +++ b/application/views/admin/index.html @@ -0,0 +1,1871 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Dashboard
+
+ +
+
+ +
+
+
+
+ group +
+ Appointments + 450 +
+
+
+ + 45% Increase in 28 Days + +
+ +
+ +
+ +
+
+ person +
+ New Patients + 155 +
+
+
+ + 40% Increase in 28 Days + +
+ +
+ +
+ +
+
+ content_cut +
+ Operations + 52 +
+
+
+ + 85% Increase in 28 Days + +
+ +
+ +
+ +
+
+ monetization_on +
+ Hospital Earning + 13,921$ +
+
+
+ + 50% Increase in 28 Days + +
+ +
+ +
+ +
+
+ + +
+
+
+
+
HOSPITAL SURVEY
+
+ + + +
+
+
+
+ +
+
+
+
+
+
+
+
HOSPITAL SURVEY
+
+ + + +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
BOOKED APPOINTMENT
+
+ + + +
+
+
+
+ +
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Patient NameAssigned DoctorDateTimeActions
+ + Jayesh Patel + Dr.Rajesh + 12/05/2016 10:45 +
+ + +
+
+ + Pooja Patel + Dr.Sarah Smith + 12/05/2016 10:55 +
+ + +
+
+ + Pankaj Singh + Dr.Rajesh + 12/05/2016 11:15 +
+ + +
+
+ + Raj Malhotra + Dr.Megha Trivedi + 12/05/2016 11:25 +
+ + +
+
+ + Sneha Pandya + Dr.Sarah Smith + 12/05/2016 11:35 +
+ + +
+
+ + Sameer Jain + Dr.Megha Trivedi + 12/05/2016 11:45 +
+ + +
+
+
+
+
+
+
+
+
+
DOCTORS LIST
+
+ + + +
+
+
+
+
    +
  • +
    + +
    +
    +
    + Dr.Rajesh -(MBBS,MD) +
    +
    + Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Sarah Smith -(MBBS,MD) +
    +
    + Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.John Deo - (BDS,MDS) +
    +
    + Not Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Jay Soni - (BHMS) +
    +
    + On Leave +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Jacob Ryan - (MBBS,MS) +
    +
    + Not Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Megha Trivedi - (MBBS,MS) +
    +
    + Available +
    +
    +
  • +
+
+ View all +
+
+
+
+
+
+ +
+
+
+
+
ADMIT PATIENT LIST
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NoNameAssigned DoctorDate Of AdmitDiseasesRoom NoEdit
1Jens BrinckerDr.Kenny Josh27/05/2016 + Influenza + 101 +
2Mark HayDr. Mark26/05/2017 + Cholera + 105 +
3Anthony DavieDr.Cinnabar21/05/2016 + Amoebiasis + 106 +
4David PerryDr.Felix 20/04/2016 + Jaundice + 105 +
5Anthony DavieDr.Beryl24/05/2016 + Leptospirosis + 102 +
6Alan GilchristDr.Joshep22/05/2016 + Hepatitis + 103 +
7Mark HayDr.Jayesh18/06/2016 + Typhoid + 107 +
8Sue WoodgerDr.Sharma17/05/2016 + Malaria + 108 +
+
+
+
+
+
+
+ +
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/invoice_payment.html b/application/views/admin/invoice_payment.html new file mode 100644 index 0000000..565e715 --- /dev/null +++ b/application/views/admin/invoice_payment.html @@ -0,0 +1,1371 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Patient's Invoice
+
+ +
+
+
+
+
+

INVOICE #345766

+
+
+
+
+
+ logo +

+ D 103, RedStar Hospital,
Opp. Town Hall,
+ Sardar Patel Road,
Ahmedabad - 380015 +

+
+
+
+
+

To,

+

Jayesh Patel

+

+ 207, Prem Sagar Appt.,
Near Income Tax Office,
+ Ashram Road,
Ahmedabad - 380057 +

+

+ Invoice Date : 14th + July 2017 +

+

+ Due Date : 24th July + 2017 +

+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#Item NameQuantityUnit CostChargesDiscountTotal
1Visiting Charges--$100-$100
2Medicines10$15$1505$1000
3X-ray Reports4$600$705$1200
4MRI2$245$12510$480
5Other Charges----$300
+
+
+
+
+

Sub - Total amount: $2600

+

Discount : $100

+

vat (10%) : $160

+
+

Total : $2760

+
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/javascript().html b/application/views/admin/javascript().html new file mode 100644 index 0000000..2f07ebe --- /dev/null +++ b/application/views/admin/javascript().html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /templates/admin/redstar/source/light/javascript() was not found on this server.

+

Additionally, a 404 Not Found +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/application/views/admin/javasctipt().html b/application/views/admin/javasctipt().html new file mode 100644 index 0000000..bcc1967 --- /dev/null +++ b/application/views/admin/javasctipt().html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /templates/admin/redstar/source/light/javasctipt() was not found on this server.

+

Additionally, a 404 Not Found +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/application/views/admin/layouts_form.html b/application/views/admin/layouts_form.html new file mode 100644 index 0000000..df1d186 --- /dev/null +++ b/application/views/admin/layouts_form.html @@ -0,0 +1,1690 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Form Layouts
+
+ +
+
+
+
+
+
+
Simple Form
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ +
+
+
+
+
+
+
+
Horizontal Form
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
Form Controls
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+ +
+ + +
+
+ + +
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
Validation States
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+ + + Success Message +
+
+ + + Warning Message +
+
+ + + Error Message +
+
+
+
+
+
+
+
Control height
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
Column Sizing
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
Input Groups
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+

With Addon

+
+ $ + +
+
+
+ + .00 +
+
+
+ $ + + .00 +
+
+
+
+

With icons

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

With checkbox and radio

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

With Buttons

+
+
+ + +
+ + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/list/enquire_list.php b/application/views/admin/list/enquire_list.php new file mode 100644 index 0000000..62b63ef --- /dev/null +++ b/application/views/admin/list/enquire_list.php @@ -0,0 +1,198 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Enquiries List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Enquiries
+ +
+
+ +
+ + + + + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($enq->result() as $s) + { + $id=$s->id; + $name=$s->name; + $mobile=$s->mobile; + $email=$s->email; + $subject=$s->subject; + $message=$s->message; + $ip=$s->ip; + $browser=$s->browser; + $cdate=$s->cdate; + ?> + + + + + + + + + + + + + + + + +
S no Name Email Mobile Subject Message IP Address Browser Post Date

View..
+
+
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + + + \ No newline at end of file diff --git a/application/views/admin/list/enquire_more.php b/application/views/admin/list/enquire_more.php new file mode 100644 index 0000000..24ddfae --- /dev/null +++ b/application/views/admin/list/enquire_more.php @@ -0,0 +1,36 @@ + +num_rows()>0) { + $rm=$res->row(); + $message= $rm->message; + + }?> + +
+
+
+
+

Message

+
+

+
+
+ + +
+
+ + +bassets/jquery-tags-input/jquery-tags-input.css" rel="stylesheet"> +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Reviews List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Reviews
+ +
+
+ +
+ + + + + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($rev->result() as $s) + { + $id=$s->id; + $username=$s->username; + $agentname=$s->agentname; + $rating=$s->rating; + $text=$s->text; + + $ip=$s->ip; + $browser=$s->browser; + $cdate=$s->cdate; + $status=$s->status; + if($status=="1"){ $revstatus="Approved"; $color="green";} + else{ $revstatus="Not Approved";$color="red";} + ?> + + + + + + + + + + + + + + + +
S no User Agent Rating text IP Address Browser Post Date Status
+
+
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + + + \ No newline at end of file diff --git a/application/views/admin/lock_screen.html b/application/views/admin/lock_screen.html new file mode 100644 index 0000000..aed3ceb --- /dev/null +++ b/application/views/admin/lock_screen.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + +
+
+
+
+ + + Dr. Kiran Patel + +

+ Locked +

+
+ + +
+
+ +
+ +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/login.html b/application/views/admin/login.html new file mode 100644 index 0000000..694e219 --- /dev/null +++ b/application/views/admin/login.html @@ -0,0 +1,75 @@ + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + +
+
+
+
+ + + Log in + +
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/login.php b/application/views/admin/login.php new file mode 100644 index 0000000..fc302e0 --- /dev/null +++ b/application/views/admin/login.php @@ -0,0 +1,78 @@ + + + + + + + + + Policybot | Admin Template + + + + + + + + + + + + + + +
+
+
+
+ + + Log in + + load->view('admin/includes/msg');?> +
+ + +
+
+ + +
+ +
+ +
+ + +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_badges.html b/application/views/admin/material_badges.html new file mode 100644 index 0000000..3898841 --- /dev/null +++ b/application/views/admin/material_badges.html @@ -0,0 +1,1374 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Badges
+
+ +
+
+
+
+
+
+
Number badge on icon
+
+
+
+
email
+
+
+
call_missed
+
+
+
message
+
+
+
shopping_cart
+
+
+
track_changes
+
+
+
error_outline
+
+
+
+
+
+
+
+
+
+
Icon badge on icon
+
+
+
+
email
+
+
+
call_missed
+
+
+
message
+
+
+
shopping_cart
+
+
+
track_changes
+
+
+
error_outline
+
+
+
+
+
+
+
+
+
+
Number badge on Label
+
+
+
+ Emails +
+
+ Calls +
+
+ Messages +
+
+ Cart +
+
+ Changes +
+
+ Errors +
+
+
+
+
+
+
+
+
+
Icon badge on Label
+
+
+
+ Emails + +
+
+ Calls + +
+
+ Messages + +
+
+ Cart + +
+
+ Changes + +
+
+ Errors + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_button.html b/application/views/admin/material_button.html new file mode 100644 index 0000000..834fa87 --- /dev/null +++ b/application/views/admin/material_button.html @@ -0,0 +1,1546 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + +
+
+
+
+
+
Buttons
+
+ +
+
+ + +
+
+
+
+
Default Buttons
+
+
+
+
+ + + + + + + +
+

Disable buttons

+
+
+
+
+ + + + + + + +
+
+
+
+
+
+
+
+
+
Rounded Buttons
+
+
+
+
+ + + + + + + +
+

Disable Rounded Buttons

+
+
+
+
+ + + + + + + +
+
+
+
+
+
+
+
+
+
+
Fab buttons
+
+
+
+
+ + + + + + + +
+

Disable buttons

+
+
+
+
+ + + + + + + +
+
+
+
+
+
+
+
+
+
Fab button with ripple
+
+
+
+
+ + + + + + + +
+

Disable Rounded Buttons

+
+
+
+
+ + + + + + + +
+
+
+
+
+
+
+
+
+
+
Flat buttons
+
+
+
+
+ + + + + + +
+

Colored Flat buttons

+
+
+
+
+ + + + +
+
+
+
+
+
+
+
+
+
Icon buttons
+
+
+
+
+ + + + +
+

Mini FAB button

+
+
+
+
+ + + + +
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_chips.html b/application/views/admin/material_chips.html new file mode 100644 index 0000000..b56b6cb --- /dev/null +++ b/application/views/admin/material_chips.html @@ -0,0 +1,1316 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Chips
+
+ +
+
+
+
+
+
+
Basic Chips
+
+
+
Basic Chip
+
Deletable Chip
+
Button Chip
+
+ + + Basic Chip + +
+
+ + + Deletable Chip + + +
+
+ + +
+
+
+
+
+
+
+
+
+
Chips with image
+
+
+
Contact Chip
+
Deletable Contact Chip
+
+
+ + + A + Contact Chip + +
+
+ + + # + Deletable Contact Chip + cancel + +
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_datepicker.html b/application/views/admin/material_datepicker.html new file mode 100644 index 0000000..8453cc2 --- /dev/null +++ b/application/views/admin/material_datepicker.html @@ -0,0 +1,1365 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
DatePicker
+
+ +
+
+
+
+
+
+
Date Picker
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
Time Picker
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
Date Time Picker
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
French Locales (Week starts at Monday)
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
Min Date set
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
Events
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_form.html b/application/views/admin/material_form.html new file mode 100644 index 0000000..33047d5 --- /dev/null +++ b/application/views/admin/material_form.html @@ -0,0 +1,1370 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Material Form
+
+ +
+
+
+
+
+
+
Material Form
+
+
+
+
+ + +
+
+
+
+ + + Number required! +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + Number required! +
+
+
+
+ + +
+
+
+
+ +
+ + +
+
+
+
+
+ + + +
    +
  • Shrilanka
  • +
  • India
  • +
  • Germany
  • +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_grid.html b/application/views/admin/material_grid.html new file mode 100644 index 0000000..99e7274 --- /dev/null +++ b/application/views/admin/material_grid.html @@ -0,0 +1,1291 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Grid
+
+ +
+
+
+
+
+
+
Grid
+
+
+
+
1
+
1
+
1
+
1
+
1
+
1
+
1
+
1
+
1
+
1
+
1
+
1
+
+
+
4
+
4
+
4
+
+
+
6
+
4
+
2
+
+
+
6 (8 tablet)
+
4 (6 tablet)
+
2 (4 phone)
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_icons.html b/application/views/admin/material_icons.html new file mode 100644 index 0000000..c0273e4 --- /dev/null +++ b/application/views/admin/material_icons.html @@ -0,0 +1,5276 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Icons page
+
+ +
+
+ +
+
+
+
+
+
+

Action

+
+
+
+ 3d_rotation 3d_rotation +
+
+
+
+ accessibility accessibility +
+
+
+
+ account_balance account_balance +
+
+
+
+ account_balance_wallet account_balance_wallet +
+
+
+
+ account_box account_box +
+
+
+
+ account_circle account_circle +
+
+
+
+ add_shopping_cart add_shopping_cart +
+
+
+
+ alarm alarm +
+
+
+
+ alarm_add alarm_add +
+
+
+
+ alarm_off alarm_off +
+
+
+
+ alarm_on alarm_on +
+
+
+
+ android android +
+
+
+
+ announcement announcement +
+
+
+
+ aspect_ratio aspect_ratio +
+
+
+
+ assessment assessment +
+
+
+
+ assignment assignment +
+
+
+
+ assignment_ind assignment_ind +
+
+
+
+ assignment_late assignment_late +
+
+
+
+ assignment_return assignment_return +
+
+
+
+ assignment_returned assignment_returned +
+
+
+
+ assignment_turned_in assignment_turned_in +
+
+
+
+ autorenew autorenew +
+
+
+
+ backup backup +
+
+
+
+ book book +
+
+
+
+ bookmark bookmark +
+
+
+
+ bookmark_border bookmark_border +
+
+
+
+ bug_report bug_report +
+
+
+
+ build build +
+
+
+
+ cached cached +
+
+
+
+ camera_enhance camera_enhance +
+
+
+
+ card_giftcard card_giftcard +
+
+
+
+ card_membership card_membership +
+
+
+
+ card_travel card_travel +
+
+
+
+ change_history change_history +
+
+
+
+ check_circle check_circle +
+
+
+
+ chrome_reader_mode chrome_reader_mode +
+
+
+
+ class class +
+
+
+
+ code code +
+
+
+
+ credit_card credit_card +
+
+
+
+ dashboard dashboard +
+
+
+
+ delete delete +
+
+
+
+ description description +
+
+
+
+ dns dns +
+
+
+
+ done done +
+
+
+
+ done_all done_all +
+
+
+
+ eject eject +
+
+
+
+ event event +
+
+
+
+ event_seat event_seat +
+
+
+
+ exit_to_app exit_to_app +
+
+
+
+ explore explore +
+
+
+
+ extension extension +
+
+
+
+ face face +
+
+
+
+ favorite favorite +
+
+
+
+ favorite_border favorite_border +
+
+
+
+ feedback feedback +
+
+
+
+ find_in_page find_in_page +
+
+
+
+ find_replace find_replace +
+
+
+
+ flight_land flight_land +
+
+
+
+ flight_takeoff flight_takeoff +
+
+
+
+ flip_to_back flip_to_back +
+
+
+
+ flip_to_front flip_to_front +
+
+
+
+ get_app get_app +
+
+
+
+ gif gif +
+
+
+
+ grade grade +
+
+
+
+ group_work group_work +
+
+
+
+ help help +
+
+
+
+ help_outline help_outline +
+
+
+
+ highlight_off highlight_off +
+
+
+
+ history history +
+
+
+
+ home home +
+
+
+
+ hourglass_empty hourglass_empty +
+
+
+
+ hourglass_full hourglass_full +
+
+
+
+ http http +
+
+
+
+ https https +
+
+
+
+ info info +
+
+
+
+ info_outline info_outline +
+
+
+
+ input input +
+
+
+
+ invert_colors invert_colors +
+
+
+
+ label label +
+
+
+
+ label_outline label_outline +
+
+
+
+ language language +
+
+
+
+ launch launch +
+
+
+
+ list list +
+
+
+
+ lock lock +
+
+
+
+ lock_open lock_open +
+
+
+
+ lock_outline lock_outline +
+
+
+
+ loyalty loyalty +
+
+
+
+ markunread_mailbox markunread_mailbox +
+
+
+
+ note_add note_add +
+
+
+
+ offline_pin offline_pin +
+
+
+
+ open_in_browser open_in_browser +
+
+
+
+ open_in_new open_in_new +
+
+
+
+ open_with open_with +
+
+
+
+ pageview pageview +
+
+
+
+ payment payment +
+
+
+
+ perm_camera_mic perm_camera_mic +
+
+
+
+ perm_contact_calendar perm_contact_calendar +
+
+
+
+ perm_data_setting perm_data_setting +
+
+
+
+ perm_device_information perm_device_information +
+
+
+
+ perm_identity perm_identity +
+
+
+
+ perm_media perm_media +
+
+
+
+ perm_phone_msg perm_phone_msg +
+
+
+
+ perm_scan_wifi perm_scan_wifi +
+
+
+
+ picture_in_picture picture_in_picture +
+
+
+
+ play_for_work play_for_work +
+
+
+
+ polymer polymer +
+
+
+
+ power_settings_new power_settings_new +
+
+
+
+ print print +
+
+
+
+ query_builder query_builder +
+
+
+
+ question_answer question_answer +
+
+
+
+ receipt receipt +
+
+
+
+ redeem redeem +
+
+
+
+ reorder reorder +
+
+
+
+ report_problem report_problem +
+
+
+
+ restore restore +
+
+
+
+ room room +
+
+
+
+ schedule schedule +
+
+
+
+ search search +
+
+
+
+ settings settings +
+
+
+
+ settings_applications settings_applications +
+
+
+
+ settings_backup_restore settings_backup_restore +
+
+
+
+ settings_bluetooth settings_bluetooth +
+
+
+
+ settings_brightness settings_brightness +
+
+
+
+ settings_cell settings_cell +
+
+
+
+ settings_ethernet settings_ethernet +
+
+
+
+ settings_input_antenna settings_input_antenna +
+
+
+
+ settings_input_component settings_input_component +
+
+
+
+ settings_input_composite settings_input_composite +
+
+
+
+ settings_input_hdmi settings_input_hdmi +
+
+
+
+ settings_input_svideo settings_input_svideo +
+
+
+
+ settings_overscan settings_overscan +
+
+
+
+ settings_phone settings_phone +
+
+
+
+ settings_power settings_power +
+
+
+
+ settings_remote settings_remote +
+
+
+
+ settings_voice settings_voice +
+
+
+
+ shop shop +
+
+
+
+ shop_two shop_two +
+
+
+
+ shopping_basket shopping_basket +
+
+
+
+ shopping_cart shopping_cart +
+
+
+
+ speaker_notes speaker_notes +
+
+
+
+ spellcheck spellcheck +
+
+
+
+ star_rate star_rate +
+
+
+
+ stars stars +
+
+
+
+ store store +
+
+
+
+ subject subject +
+
+
+
+ supervisor_account supervisor_account +
+
+
+
+ swap_horiz swap_horiz +
+
+
+
+ swap_vert swap_vert +
+
+
+
+ swap_vertical_circle swap_vertical_circle +
+
+
+
+ system_update_alt system_update_alt +
+
+
+
+ tab tab +
+
+
+
+ tab_unselected tab_unselected +
+
+
+
+ theaters theaters +
+
+
+
+ thumb_down thumb_down +
+
+
+
+ thumb_up thumb_up +
+
+
+
+ thumbs_up_down thumbs_up_down +
+
+
+
+ toc toc +
+
+
+
+ today today +
+
+
+
+ toll toll +
+
+
+
+ track_changes track_changes +
+
+
+
+ translate translate +
+
+
+
+ trending_down trending_down +
+
+
+
+ trending_flat trending_flat +
+
+
+
+ trending_up trending_up +
+
+
+
+ turned_in turned_in +
+
+
+
+ turned_in_not turned_in_not +
+
+
+
+ verified_user verified_user +
+
+
+
+ view_agenda view_agenda +
+
+
+
+ view_array view_array +
+
+
+
+ view_carousel view_carousel +
+
+
+
+ view_column view_column +
+
+
+
+ view_day view_day +
+
+
+
+ view_headline view_headline +
+
+
+
+ view_list view_list +
+
+
+
+ view_module view_module +
+
+
+
+ view_quilt view_quilt +
+
+
+
+ view_stream view_stream +
+
+
+
+ view_week view_week +
+
+
+
+ visibility visibility +
+
+
+
+ visibility_off visibility_off +
+
+
+
+ work work +
+
+
+
+ youtube_searched_for youtube_searched_for +
+
+
+
+ zoom_in zoom_in +
+
+
+
+ zoom_out zoom_out +
+
+
+

Alert

+
+
+
+ add_alert add_alert +
+
+
+
+ error error +
+
+
+
+ error_outline error_outline +
+
+
+
+ warning warning +
+
+
+

AV

+
+
+
+ airplay airplay +
+
+
+
+ album album +
+
+
+
+ av_timer av_timer +
+
+
+
+ closed_caption closed_caption +
+
+
+
+ equalizer equalizer +
+
+
+
+ explicit explicit +
+
+
+
+ fast_forward fast_forward +
+
+
+
+ fast_rewind fast_rewind +
+
+
+
+ forward_10 forward_10 +
+
+
+
+ forward_30 forward_30 +
+
+
+
+ forward_5 forward_5 +
+
+
+
+ games games +
+
+
+
+ hd hd +
+
+
+
+ hearing hearing +
+
+
+
+ high_quality high_quality +
+
+
+
+ library_add library_add +
+
+
+
+ library_books library_books +
+
+
+
+ library_music library_music +
+
+
+
+ loop loop +
+
+
+
+ mic mic +
+
+
+
+ mic_none mic_none +
+
+
+
+ mic_off mic_off +
+
+
+
+ movie movie +
+
+
+
+ new_releases new_releases +
+
+
+
+ not_interested not_interested +
+
+
+
+ pause pause +
+
+
+
+ pause_circle_filled pause_circle_filled +
+
+
+
+ pause_circle_outline pause_circle_outline +
+
+
+
+ play_arrow play_arrow +
+
+
+
+ play_circle_filled play_circle_filled +
+
+
+
+ play_circle_outline play_circle_outline +
+
+
+
+ playlist_add playlist_add +
+
+
+
+ queue queue +
+
+
+
+ queue_music queue_music +
+
+
+
+ radio radio +
+
+
+
+ recent_actors recent_actors +
+
+
+
+ repeat repeat +
+
+
+
+ repeat_one repeat_one +
+
+
+
+ replay replay +
+
+
+
+ replay_10 replay_10 +
+
+
+
+ replay_30 replay_30 +
+
+
+
+ replay_5 replay_5 +
+
+
+
+ shuffle shuffle +
+
+
+
+ skip_next skip_next +
+
+
+
+ skip_previous skip_previous +
+
+
+
+ snooze snooze +
+
+
+
+ sort_by_alpha sort_by_alpha +
+
+
+
+ stop stop +
+
+
+
+ subtitles subtitles +
+
+
+
+ surround_sound surround_sound +
+
+
+
+ video_library video_library +
+
+
+
+ videocam videocam +
+
+
+
+ videocam_off videocam_off +
+
+
+
+ volume_down volume_down +
+
+
+
+ volume_mute volume_mute +
+
+
+
+ volume_off volume_off +
+
+
+
+ volume_up volume_up +
+
+
+
+ web web +
+
+
+

Communication

+
+
+
+ business business +
+
+
+
+ call call +
+
+
+
+ call_end call_end +
+
+
+
+ call_made call_made +
+
+
+
+ call_merge call_merge +
+
+
+
+ call_missed call_missed +
+
+
+
+ call_received call_received +
+
+
+
+ call_split call_split +
+
+
+
+ chat chat +
+
+
+
+ chat_bubble chat_bubble +
+
+
+
+ chat_bubble_outline chat_bubble_outline +
+
+
+
+ clear_all clear_all +
+
+
+
+ comment comment +
+
+
+
+ contact_phone contact_phone +
+
+
+
+ contacts contacts +
+
+
+
+ dialer_sip dialer_sip +
+
+
+
+ dialpad dialpad +
+
+
+
+ email email +
+
+
+
+ forum forum +
+
+
+
+ import_export import_export +
+
+
+
+ invert_colors_off invert_colors_off +
+
+
+
+ live_help live_help +
+
+
+
+ location_off location_off +
+
+
+
+ location_on location_on +
+
+
+
+ message message +
+
+
+
+ no_sim no_sim +
+
+
+
+ phone phone +
+
+
+
+ phonelink_erase phonelink_erase +
+
+
+
+ phonelink_lock phonelink_lock +
+
+
+
+ phonelink_ring phonelink_ring +
+
+
+
+ phonelink_setup phonelink_setup +
+
+
+
+ portable_wifi_off portable_wifi_off +
+
+
+
+ present_to_all present_to_all +
+
+
+
+ ring_volume ring_volume +
+
+
+
+ speaker_phone speaker_phone +
+
+
+
+ stay_current_landscape stay_current_landscape +
+
+
+
+ stay_current_portrait stay_current_portrait +
+
+
+
+ stay_primary_landscape stay_primary_landscape +
+
+
+
+ stay_primary_portrait stay_primary_portrait +
+
+
+
+ swap_calls swap_calls +
+
+
+
+ textsms textsms +
+
+
+
+ voicemail voicemail +
+
+
+
+ vpn_key vpn_key +
+
+
+

Content

+
+
+
+ add add +
+
+
+
+ add_box add_box +
+
+
+
+ add_circle add_circle +
+
+
+
+ add_circle_outline add_circle_outline +
+
+
+
+ archive archive +
+
+
+
+ backspace backspace +
+
+
+
+ block block +
+
+
+
+ clear clear +
+
+
+
+ content_copy content_copy +
+
+
+
+ content_cut content_cut +
+
+
+
+ content_paste content_paste +
+
+
+
+ create create +
+
+
+
+ drafts drafts +
+
+
+
+ filter_list filter_list +
+
+
+
+ flag flag +
+
+
+
+ font_download font_download +
+
+
+
+ forward forward +
+
+
+
+ gesture gesture +
+
+
+
+ inbox inbox +
+
+
+
+ link link +
+
+
+
+ mail mail +
+
+
+
+ markunread markunread +
+
+
+
+ redo redo +
+
+
+
+ remove remove +
+
+
+
+ remove_circle remove_circle +
+
+
+
+ remove_circle_outline remove_circle_outline +
+
+
+
+ reply reply +
+
+
+
+ reply_all reply_all +
+
+
+
+ report report +
+
+
+
+ save save +
+
+
+
+ select_all select_all +
+
+
+
+ send send +
+
+
+
+ sort sort +
+
+
+
+ text_format text_format +
+
+
+
+ undo undo +
+
+
+

Device

+
+
+
+ access_alarm access_alarm +
+
+
+
+ access_alarms access_alarms +
+
+
+
+ access_time access_time +
+
+
+
+ add_alarm add_alarm +
+
+
+
+ airplanemode_active airplanemode_active +
+
+
+
+ airplanemode_inactive airplanemode_inactive +
+
+
+
+ battery_alert battery_alert +
+
+
+
+ battery_charging_full battery_charging_full +
+
+
+
+ battery_full battery_full +
+
+
+
+ battery_std battery_std +
+
+
+
+ battery_unknown battery_unknown +
+
+
+
+ bluetooth bluetooth +
+
+
+
+ bluetooth_connected bluetooth_connected +
+
+
+
+ bluetooth_disabled bluetooth_disabled +
+
+
+
+ bluetooth_searching bluetooth_searching +
+
+
+
+ brightness_auto brightness_auto +
+
+
+
+ brightness_high brightness_high +
+
+
+
+ brightness_low brightness_low +
+
+
+
+ brightness_medium brightness_medium +
+
+
+
+ data_usage data_usage +
+
+
+
+ developer_mode developer_mode +
+
+
+
+ devices devices +
+
+
+
+ dvr dvr +
+
+
+
+ gps_fixed gps_fixed +
+
+
+
+ gps_not_fixed gps_not_fixed +
+
+
+
+ gps_off gps_off +
+
+
+
+ graphic_eq graphic_eq +
+
+
+
+ location_disabled location_disabled +
+
+
+
+ location_searching location_searching +
+
+
+
+ network_cell network_cell +
+
+
+
+ network_wifi network_wifi +
+
+
+
+ nfc nfc +
+
+
+
+ screen_lock_landscape screen_lock_landscape +
+
+
+
+ screen_lock_portrait screen_lock_portrait +
+
+
+
+ screen_lock_rotation screen_lock_rotation +
+
+
+
+ screen_rotation screen_rotation +
+
+
+
+ sd_storage sd_storage +
+
+
+
+ settings_system_daydream settings_system_daydream +
+
+
+
+ signal_cellular_4_bar signal_cellular_4_bar +
+
+
+
+ signal_cellular_connected_no_internet_4_bar + signal_cellular_connected_no_internet_4_bar +
+
+
+
+ signal_cellular_no_sim signal_cellular_no_sim +
+
+
+
+ signal_cellular_null signal_cellular_null +
+
+
+
+ signal_cellular_off signal_cellular_off +
+
+
+
+ signal_wifi_4_bar signal_wifi_4_bar +
+
+
+
+ signal_wifi_4_bar_lock signal_wifi_4_bar_lock +
+
+
+
+ signal_wifi_off signal_wifi_off +
+
+
+
+ storage storage +
+
+
+
+ usb usb +
+
+
+
+ wallpaper wallpaper +
+
+
+
+ widgets widgets +
+
+
+
+ wifi_lock wifi_lock +
+
+
+
+ wifi_tethering wifi_tethering +
+
+
+

Editor

+
+
+
+ attach_file attach_file +
+
+
+
+ attach_money attach_money +
+
+
+
+ border_all border_all +
+
+
+
+ border_bottom border_bottom +
+
+
+
+ border_clear border_clear +
+
+
+
+ border_color border_color +
+
+
+
+ border_horizontal border_horizontal +
+
+
+
+ border_inner border_inner +
+
+
+
+ border_left border_left +
+
+
+
+ border_outer border_outer +
+
+
+
+ border_right border_right +
+
+
+
+ border_style border_style +
+
+
+
+ border_top border_top +
+
+
+
+ border_vertical border_vertical +
+
+
+
+ format_align_center format_align_center +
+
+
+
+ format_align_justify format_align_justify +
+
+
+
+ format_align_left format_align_left +
+
+
+
+ format_align_right format_align_right +
+
+
+
+ format_bold format_bold +
+
+
+
+ format_clear format_clear +
+
+
+
+ format_color_fill format_color_fill +
+
+
+
+ format_color_reset format_color_reset +
+
+
+
+ format_color_text format_color_text +
+
+
+
+ format_indent_decrease format_indent_decrease +
+
+
+
+ format_indent_increase format_indent_increase +
+
+
+
+ format_italic format_italic +
+
+
+
+ format_line_spacing format_line_spacing +
+
+
+
+ format_list_bulleted format_list_bulleted +
+
+
+
+ format_list_numbered format_list_numbered +
+
+
+
+ format_paint format_paint +
+
+
+
+ format_quote format_quote +
+
+
+
+ format_size format_size +
+
+
+
+ format_strikethrough format_strikethrough +
+
+
+
+ format_textdirection_l_to_r format_textdirection_l_to_r +
+
+
+
+ format_textdirection_r_to_l format_textdirection_r_to_l +
+
+
+
+ format_underlined format_underlined +
+
+
+
+ functions functions +
+
+
+
+ insert_chart insert_chart +
+
+
+
+ insert_comment insert_comment +
+
+
+
+ insert_drive_file insert_drive_file +
+
+
+
+ insert_emoticon insert_emoticon +
+
+
+
+ insert_invitation insert_invitation +
+
+
+
+ insert_link insert_link +
+
+
+
+ insert_photo insert_photo +
+
+
+
+ merge_type merge_type +
+
+
+
+ mode_comment mode_comment +
+
+
+
+ mode_edit mode_edit +
+
+
+
+ money_off money_off +
+
+
+
+ publish publish +
+
+
+
+ space_bar space_bar +
+
+
+
+ strikethrough_s strikethrough_s +
+
+
+
+ vertical_align_bottom vertical_align_bottom +
+
+
+
+ vertical_align_center vertical_align_center +
+
+
+
+ vertical_align_top vertical_align_top +
+
+
+
+ wrap_text wrap_text +
+
+
+

File

+
+
+
+ attachment attachment +
+
+
+
+ cloud cloud +
+
+
+
+ cloud_circle cloud_circle +
+
+
+
+ cloud_done cloud_done +
+
+
+
+ cloud_download cloud_download +
+
+
+
+ cloud_off cloud_off +
+
+
+
+ cloud_queue cloud_queue +
+
+
+
+ cloud_upload cloud_upload +
+
+
+
+ file_download file_download +
+
+
+
+ file_upload file_upload +
+
+
+
+ folder folder +
+
+
+
+ folder_open folder_open +
+
+
+
+ folder_shared folder_shared +
+
+
+

Hardware

+
+
+
+ cast cast +
+
+
+
+ cast_connected cast_connected +
+
+
+
+ computer computer +
+
+
+
+ desktop_mac desktop_mac +
+
+
+
+ desktop_windows desktop_windows +
+
+
+
+ developer_board developer_board +
+
+
+
+ device_hub device_hub +
+
+
+
+ dock dock +
+
+
+
+ gamepad gamepad +
+
+
+
+ headset headset +
+
+
+
+ headset_mic headset_mic +
+
+
+
+ keyboard keyboard +
+
+
+
+ keyboard_arrow_down keyboard_arrow_down +
+
+
+
+ keyboard_arrow_left keyboard_arrow_left +
+
+
+
+ keyboard_arrow_right keyboard_arrow_right +
+
+
+
+ keyboard_arrow_up keyboard_arrow_up +
+
+
+
+ keyboard_backspace keyboard_backspace +
+
+
+
+ keyboard_capslock keyboard_capslock +
+
+
+
+ keyboard_hide keyboard_hide +
+
+
+
+ keyboard_return keyboard_return +
+
+
+
+ keyboard_tab keyboard_tab +
+
+
+
+ keyboard_voice keyboard_voice +
+
+
+
+ laptop laptop +
+
+
+
+ laptop_chromebook laptop_chromebook +
+
+
+
+ laptop_mac laptop_mac +
+
+
+
+ laptop_windows laptop_windows +
+
+
+
+ memory memory +
+
+
+
+ mouse mouse +
+
+
+
+ phone_android phone_android +
+
+
+
+ phone_iphone phone_iphone +
+
+
+
+ phonelink phonelink +
+
+
+
+ phonelink_off phonelink_off +
+
+
+
+ power_input power_input +
+
+
+
+ router router +
+
+
+
+ scanner scanner +
+
+
+
+ security security +
+
+
+
+ sim_card sim_card +
+
+
+
+ smartphone smartphone +
+
+
+
+ speaker speaker +
+
+
+
+ speaker_group speaker_group +
+
+
+
+ tablet tablet +
+
+
+
+ tablet_android tablet_android +
+
+
+
+ tablet_mac tablet_mac +
+
+
+
+ toys toys +
+
+
+
+ tv tv +
+
+
+
+ watch watch +
+
+
+

Image

+
+
+
+ add_to_photos add_to_photos +
+
+
+
+ adjust adjust +
+
+
+
+ assistant assistant +
+
+
+
+ assistant_photo assistant_photo +
+
+
+
+ audiotrack audiotrack +
+
+
+
+ blur_circular blur_circular +
+
+
+
+ blur_linear blur_linear +
+
+
+
+ blur_off blur_off +
+
+
+
+ blur_on blur_on +
+
+
+
+ brightness_1 brightness_1 +
+
+
+
+ brightness_2 brightness_2 +
+
+
+
+ brightness_3 brightness_3 +
+
+
+
+ brightness_4 brightness_4 +
+
+
+
+ brightness_5 brightness_5 +
+
+
+
+ brightness_6 brightness_6 +
+
+
+
+ brightness_7 brightness_7 +
+
+
+
+ broken_image broken_image +
+
+
+
+ brush brush +
+
+
+
+ camera camera +
+
+
+
+ camera_alt camera_alt +
+
+
+
+ camera_front camera_front +
+
+
+
+ camera_rear camera_rear +
+
+
+
+ camera_roll camera_roll +
+
+
+
+ center_focus_strong center_focus_strong +
+
+
+
+ center_focus_weak center_focus_weak +
+
+
+
+ collections collections +
+
+
+
+ collections_bookmark collections_bookmark +
+
+
+
+ color_lens color_lens +
+
+
+
+ colorize colorize +
+
+
+
+ compare compare +
+
+
+
+ control_point control_point +
+
+
+
+ control_point_duplicate control_point_duplicate +
+
+
+
+ crop crop +
+
+
+
+ crop_16_9 crop_16_9 +
+
+
+
+ crop_3_2 crop_3_2 +
+
+
+
+ crop_5_4 crop_5_4 +
+
+
+
+ crop_7_5 crop_7_5 +
+
+
+
+ crop_din crop_din +
+
+
+
+ crop_free crop_free +
+
+
+
+ crop_landscape crop_landscape +
+
+
+
+ crop_original crop_original +
+
+
+
+ crop_portrait crop_portrait +
+
+
+
+ crop_square crop_square +
+
+
+
+ dehaze dehaze +
+
+
+
+ details details +
+
+
+
+ edit edit +
+
+
+
+ exposure exposure +
+
+
+
+ exposure_neg_1 exposure_neg_1 +
+
+
+
+ exposure_neg_2 exposure_neg_2 +
+
+
+
+ exposure_plus_1 exposure_plus_1 +
+
+
+
+ exposure_plus_2 exposure_plus_2 +
+
+
+
+ exposure_zero exposure_zero +
+
+
+
+ filter filter +
+
+
+
+ filter_1 filter_1 +
+
+
+
+ filter_2 filter_2 +
+
+
+
+ filter_3 filter_3 +
+
+
+
+ filter_4 filter_4 +
+
+
+
+ filter_5 filter_5 +
+
+
+
+ filter_6 filter_6 +
+
+
+
+ filter_7 filter_7 +
+
+
+
+ filter_8 filter_8 +
+
+
+
+ filter_9 filter_9 +
+
+
+
+ filter_9_plus filter_9_plus +
+
+
+
+ filter_b_and_w filter_b_and_w +
+
+
+
+ filter_center_focus filter_center_focus +
+
+
+
+ filter_drama filter_drama +
+
+
+
+ filter_frames filter_frames +
+
+
+
+ filter_hdr filter_hdr +
+
+
+
+ filter_none filter_none +
+
+
+
+ filter_tilt_shift filter_tilt_shift +
+
+
+
+ filter_vintage filter_vintage +
+
+
+
+ flare flare +
+
+
+
+ flash_auto flash_auto +
+
+
+
+ flash_off flash_off +
+
+
+
+ flash_on flash_on +
+
+
+
+ flip flip +
+
+
+
+ gradient gradient +
+
+
+
+ grain grain +
+
+
+
+ grid_off grid_off +
+
+
+
+ grid_on grid_on +
+
+
+
+ hdr_off hdr_off +
+
+
+
+ hdr_on hdr_on +
+
+
+
+ hdr_strong hdr_strong +
+
+
+
+ hdr_weak hdr_weak +
+
+
+
+ healing healing +
+
+
+
+ image image +
+
+
+
+ image_aspect_ratio image_aspect_ratio +
+
+
+
+ iso iso +
+
+
+
+ landscape landscape +
+
+
+
+ leak_add leak_add +
+
+
+
+ leak_remove leak_remove +
+
+
+
+ lens lens +
+
+
+
+ looks looks +
+
+
+
+ looks_3 looks_3 +
+
+
+
+ looks_4 looks_4 +
+
+
+
+ looks_5 looks_5 +
+
+
+
+ looks_6 looks_6 +
+
+
+
+ looks_one looks_one +
+
+
+
+ looks_two looks_two +
+
+
+
+ loupe loupe +
+
+
+
+ monochrome_photos monochrome_photos +
+
+
+
+ movie_creation movie_creation +
+
+
+
+ music_note music_note +
+
+
+
+ nature nature +
+
+
+
+ nature_people nature_people +
+
+
+
+ navigate_before navigate_before +
+
+
+
+ navigate_next navigate_next +
+
+
+
+ palette palette +
+
+
+
+ panorama panorama +
+
+
+
+ panorama_fish_eye panorama_fish_eye +
+
+
+
+ panorama_horizontal panorama_horizontal +
+
+
+
+ panorama_vertical panorama_vertical +
+
+
+
+ panorama_wide_angle panorama_wide_angle +
+
+
+
+ photo photo +
+
+
+
+ photo_album photo_album +
+
+
+
+ photo_camera photo_camera +
+
+
+
+ photo_library photo_library +
+
+
+
+ photo_size_select_actual photo_size_select_actual +
+
+
+
+ photo_size_select_large photo_size_select_large +
+
+
+
+ photo_size_select_small photo_size_select_small +
+
+
+
+ picture_as_pdf picture_as_pdf +
+
+
+
+ portrait portrait +
+
+
+
+ remove_red_eye remove_red_eye +
+
+
+
+ rotate_90_degrees_ccw rotate_90_degrees_ccw +
+
+
+
+ rotate_left rotate_left +
+
+
+
+ rotate_right rotate_right +
+
+
+
+ slideshow slideshow +
+
+
+
+ straighten straighten +
+
+
+
+ style style +
+
+
+
+ switch_camera switch_camera +
+
+
+
+ switch_video switch_video +
+
+
+
+ tag_faces tag_faces +
+
+
+
+ texture texture +
+
+
+
+ timelapse timelapse +
+
+
+
+ timer timer +
+
+
+
+ timer_10 timer_10 +
+
+
+
+ timer_3 timer_3 +
+
+
+
+ timer_off timer_off +
+
+
+
+ tonality tonality +
+
+
+
+ transform transform +
+
+
+
+ tune tune +
+
+
+
+ view_comfy view_comfy +
+
+
+
+ view_compact view_compact +
+
+
+
+ vignette vignette +
+
+
+
+ wb_auto wb_auto +
+
+
+
+ wb_cloudy wb_cloudy +
+
+
+
+ wb_incandescent wb_incandescent +
+
+
+
+ wb_iridescent wb_iridescent +
+
+
+
+ wb_sunny wb_sunny +
+
+
+

Maps

+
+
+
+ beenhere beenhere +
+
+
+
+ directions directions +
+
+
+
+ directions_bike directions_bike +
+
+
+
+ directions_boat directions_boat +
+
+
+
+ directions_bus directions_bus +
+
+
+
+ directions_car directions_car +
+
+
+
+ directions_railway directions_railway +
+
+
+
+ directions_run directions_run +
+
+
+
+ directions_subway directions_subway +
+
+
+
+ directions_transit directions_transit +
+
+
+
+ directions_walk directions_walk +
+
+
+
+ flight flight +
+
+
+
+ hotel hotel +
+
+
+
+ layers layers +
+
+
+
+ layers_clear layers_clear +
+
+
+
+ local_activity local_activity +
+
+
+
+ local_airport local_airport +
+
+
+
+ local_atm local_atm +
+
+
+
+ local_bar local_bar +
+
+
+
+ local_cafe local_cafe +
+
+
+
+ local_car_wash local_car_wash +
+
+
+
+ local_convenience_store local_convenience_store +
+
+
+
+ local_dining local_dining +
+
+
+
+ local_drink local_drink +
+
+
+
+ local_florist local_florist +
+
+
+
+ local_gas_station local_gas_station +
+
+
+
+ local_grocery_store local_grocery_store +
+
+
+
+ local_hospital local_hospital +
+
+
+
+ local_hotel local_hotel +
+
+
+
+ local_laundry_service local_laundry_service +
+
+
+
+ local_library local_library +
+
+
+
+ local_mall local_mall +
+
+
+
+ local_movies local_movies +
+
+
+
+ local_offer local_offer +
+
+
+
+ local_parking local_parking +
+
+
+
+ local_pharmacy local_pharmacy +
+
+
+
+ local_phone local_phone +
+
+
+
+ local_pizza local_pizza +
+
+
+
+ local_play local_play +
+
+
+
+ local_post_office local_post_office +
+
+
+
+ local_printshop local_printshop +
+
+
+
+ local_see local_see +
+
+
+
+ local_shipping local_shipping +
+
+
+
+ local_taxi local_taxi +
+
+
+
+ map map +
+
+
+
+ my_location my_location +
+
+
+
+ navigation navigation +
+
+
+
+ person_pin person_pin +
+
+
+
+ pin_drop pin_drop +
+
+
+
+ place place +
+
+
+
+ rate_review rate_review +
+
+
+
+ restaurant_menu restaurant_menu +
+
+
+
+ satellite satellite +
+
+
+
+ store_mall_directory store_mall_directory +
+
+
+
+ terrain terrain +
+
+
+
+ traffic traffic +
+
+
+
+ apps apps +
+
+
+
+ arrow_back arrow_back +
+
+
+
+ arrow_drop_down arrow_drop_down +
+
+
+
+ arrow_drop_down_circle arrow_drop_down_circle +
+
+
+
+ arrow_drop_up arrow_drop_up +
+
+
+
+ arrow_forward arrow_forward +
+
+
+
+ cancel cancel +
+
+
+
+ check check +
+
+
+
+ chevron_left chevron_left +
+
+
+
+ chevron_right chevron_right +
+
+
+
+ close close +
+
+
+
+ expand_less expand_less +
+
+
+
+ expand_more expand_more +
+
+
+
+ fullscreen fullscreen +
+
+
+
+ fullscreen_exit fullscreen_exit +
+
+
+
+ menu menu +
+
+
+
+ more_horiz more_horiz +
+
+
+
+ more_vert more_vert +
+
+
+
+ refresh refresh +
+
+
+

Navigation

+
+
+
+ adb adb +
+
+
+
+ airline_seat_flat airline_seat_flat +
+
+
+
+ airline_seat_flat_angled airline_seat_flat_angled +
+
+
+
+ airline_seat_individual_suite airline_seat_individual_suite +
+
+
+
+ airline_seat_legroom_extra airline_seat_legroom_extra +
+
+
+
+ airline_seat_legroom_normal airline_seat_legroom_normal +
+
+
+
+ airline_seat_legroom_reduced airline_seat_legroom_reduced +
+
+
+
+ airline_seat_recline_extra airline_seat_recline_extra +
+
+
+
+ airline_seat_recline_normal airline_seat_recline_normal +
+
+
+
+ bluetooth_audio bluetooth_audio +
+
+
+
+ confirmation_number confirmation_number +
+
+
+
+ disc_full disc_full +
+
+
+
+ do_not_disturb do_not_disturb +
+
+
+
+ do_not_disturb_alt do_not_disturb_alt +
+
+
+
+ drive_eta drive_eta +
+
+
+
+ event_available event_available +
+
+
+
+ event_busy event_busy +
+
+
+
+ event_note event_note +
+
+
+
+ folder_special folder_special +
+
+
+
+ live_tv live_tv +
+
+
+
+ mms mms +
+
+
+
+ more more +
+
+
+
+ network_locked network_locked +
+
+
+
+ ondemand_video ondemand_video +
+
+
+
+ personal_video personal_video +
+
+
+
+ phone_bluetooth_speaker phone_bluetooth_speaker +
+
+
+
+ phone_forwarded phone_forwarded +
+
+
+
+ phone_in_talk phone_in_talk +
+
+
+
+ phone_locked phone_locked +
+
+
+
+ phone_missed phone_missed +
+
+
+
+ phone_paused phone_paused +
+
+
+
+ power power +
+
+
+
+ sd_card sd_card +
+
+
+
+ sim_card_alert sim_card_alert +
+
+
+
+ sms sms +
+
+
+
+ sms_failed sms_failed +
+
+
+
+ sync sync +
+
+
+
+ sync_disabled sync_disabled +
+
+
+
+ sync_problem sync_problem +
+
+
+
+ system_update system_update +
+
+
+
+ tap_and_play tap_and_play +
+
+
+
+ time_to_leave time_to_leave +
+
+
+
+ vibration vibration +
+
+
+
+ voice_chat voice_chat +
+
+
+
+ vpn_lock vpn_lock +
+
+
+
+ wc wc +
+
+
+
+ wifi wifi +
+
+
+

Social

+
+
+
+ cake cake +
+
+
+
+ domain domain +
+
+
+
+ group group +
+
+
+
+ group_add group_add +
+
+
+
+ location_city location_city +
+
+
+
+ mood mood +
+
+
+
+ mood_bad mood_bad +
+
+
+
+ notifications notifications +
+
+
+
+ notifications_active notifications_active +
+
+
+
+ notifications_none notifications_none +
+
+
+
+ notifications_off notifications_off +
+
+
+
+ notifications_paused notifications_paused +
+
+
+
+ pages pages +
+
+
+
+ party_mode party_mode +
+
+
+
+ people people +
+
+
+
+ people_outline people_outline +
+
+
+
+ person person +
+
+
+
+ person_add person_add +
+
+
+
+ person_outline person_outline +
+
+
+
+ plus_one plus_one +
+
+
+
+ poll poll +
+
+
+
+ public public +
+
+
+
+ school school +
+
+
+
+ share share +
+
+
+
+ whatshot whatshot +
+
+
+

Toggle

+
+
+
+ check_box check_box +
+
+
+
+ check_box_outline_blank check_box_outline_blank +
+
+
+
+ indeterminate_check_box indeterminate_check_box +
+
+
+
+ radio_button_checked radio_button_checked +
+
+
+
+ radio_button_unchecked radio_button_unchecked +
+
+
+
+ star star +
+
+
+
+ star_border star_border +
+
+
+
+ star_half star_half +
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_loading.html b/application/views/admin/material_loading.html new file mode 100644 index 0000000..6bb86f7 --- /dev/null +++ b/application/views/admin/material_loading.html @@ -0,0 +1,1295 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Loading
+
+ +
+
+
+
+
+
+
Progress Bar
+
+
+
Default Progress bar
+
+
Indeterminate Progress bar
+
+
Buffering Progress bar
+
+
+
+
+
+
+
+
+
+
Progress Bar
+
+
+
Default Spinner
+
+
Spinner Component with Single Color
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_menu.html b/application/views/admin/material_menu.html new file mode 100644 index 0000000..72b6cd2 --- /dev/null +++ b/application/views/admin/material_menu.html @@ -0,0 +1,1346 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Menu
+
+ +
+
+
+
+
+
+
Top Left Menu
+
+
+ +
    +
  • Item #1
  • +
  • Item #2
  • +
  • Item #3
  • +
+ +
+
+
+
+
+
+
Top Right Menu
+
+
+ + +
+
+
+
+
+
+
+
+
Lower Left Menu
+
+
+ + +
+
+
+
+
+
+
Lower Right Menu
+
+
+ + +
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_select.html b/application/views/admin/material_select.html new file mode 100644 index 0000000..2f19815 --- /dev/null +++ b/application/views/admin/material_select.html @@ -0,0 +1,1290 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Select
+
+ +
+
+
+
+
+
+
Select Item
+
+
+
+
+ + +
    +
  • Shrilanka
  • +
  • India
  • +
  • Germany
  • +
+
+
+
+ +
+ + + +
    +
  • Shrilanka
  • +
  • India
  • +
  • Germany
  • +
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_slider.html b/application/views/admin/material_slider.html new file mode 100644 index 0000000..5da00c4 --- /dev/null +++ b/application/views/admin/material_slider.html @@ -0,0 +1,1271 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Sliders
+
+ +
+
+
+
+
+
+
Sliders
+
+
+
Default Slider
+ +
Slider with initial value
+ +
Disabled Slider
+ +
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_tab.html b/application/views/admin/material_tab.html new file mode 100644 index 0000000..ee2e0d4 --- /dev/null +++ b/application/views/admin/material_tab.html @@ -0,0 +1,1378 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Tabs
+
+ +
+
+
+
+
+
+
Material Design Tabs
+
+
+
+
+ Tab 1 + Tab 2 + Tab 3 +
+
+

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore + eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore + et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. + Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut + labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea + rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor + sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

You'll. His have you'll day make beginning good, herb. Can't place lights was evening let his itself. His + seas unto replenish may every said midst him. Night to air behold tree years sixth waters. Unto together + can't darkness sixth heaven it. Fruit. Image. Winged, a own. The waters multiply were male. Wherein + gathering replenish gathering blessed dry called second. It Beginning whose you every dry them midst don't + place you're sixth he above hath, fish sea fifth. Brought called. +

+

+
+
+
+
+
+
+
+
+
+
Material Design Tabs With Left Align
+
+
+
+
+ Tab 1 + Tab 2 + Tab 3 +
+
+

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore + eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore + et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. + Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut + labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea + rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor + sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

You'll. His have you'll day make beginning good, herb. Can't place lights was evening let his itself. His + seas unto replenish may every said midst him. Night to air behold tree years sixth waters. Unto together + can't darkness sixth heaven it. Fruit. Image. Winged, a own. The waters multiply were male. Wherein + gathering replenish gathering blessed dry called second. It Beginning whose you every dry them midst don't + place you're sixth he above hath, fish sea fifth. Brought called. +

+

+
+
+
+
+
+
+
+
+
+
Material Design Tabs With Right Align
+
+
+
+
+ Tab 1 + Tab 2 + Tab 3 +
+
+

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore + eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore + et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. + Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut + labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea + rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor + sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

You'll. His have you'll day make beginning good, herb. Can't place lights was evening let his itself. His + seas unto replenish may every said midst him. Night to air behold tree years sixth waters. Unto together + can't darkness sixth heaven it. Fruit. Image. Winged, a own. The waters multiply were male. Wherein + gathering replenish gathering blessed dry called second. It Beginning whose you every dry them midst don't + place you're sixth he above hath, fish sea fifth. Brought called. +

+

+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_tables.html b/application/views/admin/material_tables.html new file mode 100644 index 0000000..00bcebd --- /dev/null +++ b/application/views/admin/material_tables.html @@ -0,0 +1,1544 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Tables
+
+ +
+
+
+
+
+
+
Normal table
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAddressQuantityTaxDiscountUnit price
Acrylic (Transparent)Gandhi road, Ahmedabad25$1.00$0.90$12.90
Plywood (Birch)Gandhi road, Ahmedabad50$1.00$0.90$1.25
Laminate (Gold on Blue)Gandhi road, Ahmedabad10$1.00$0.90$2.35
Acrylic (Transparent)Gandhi road, Ahmedabad25$1.00$0.90$12.90
Plywood (Birch)Gandhi road, Ahmedabad50$1.00$0.90$1.25
Laminate (Gold on Blue)Gandhi road, Ahmedabad10$1.00$0.90$2.35
+
+
+
+
+
+
+
+
+
Striped table
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAddressQuantityTaxDiscountUnit price
Acrylic (Transparent)Gandhi road, Ahmedabad25$1.00$0.90$12.90
Plywood (Birch)Gandhi road, Ahmedabad50$1.00$0.90$1.25
Laminate (Gold on Blue)Gandhi road, Ahmedabad10$1.00$0.90$2.35
Acrylic (Transparent)Gandhi road, Ahmedabad25$1.00$0.90$12.90
Plywood (Birch)Gandhi road, Ahmedabad50$1.00$0.90$1.25
Laminate (Gold on Blue)Gandhi road, Ahmedabad10$1.00$0.90$2.35
+
+
+
+
+
+
+
+
+
Bordered table
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAddressQuantityTaxDiscountUnit price
Acrylic (Transparent)Gandhi road, Ahmedabad25$1.00$0.90$12.90
Plywood (Birch)Gandhi road, Ahmedabad50$1.00$0.90$1.25
Laminate (Gold on Blue)Gandhi road, Ahmedabad10$1.00$0.90$2.35
Acrylic (Transparent)Gandhi road, Ahmedabad25$1.00$0.90$12.90
Plywood (Birch)Gandhi road, Ahmedabad50$1.00$0.90$1.25
Laminate (Gold on Blue)Gandhi road, Ahmedabad10$1.00$0.90$2.35
+
+
+
+
+
+
+
+
+
Bordered and Striped table
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAddressQuantityTaxDiscountUnit price
Acrylic (Transparent)Gandhi road, Ahmedabad25$1.00$0.90$12.90
Plywood (Birch)Gandhi road, Ahmedabad50$1.00$0.90$1.25
Laminate (Gold on Blue)Gandhi road, Ahmedabad10$1.00$0.90$2.35
Acrylic (Transparent)Gandhi road, Ahmedabad25$1.00$0.90$12.90
Plywood (Birch)Gandhi road, Ahmedabad50$1.00$0.90$1.25
Laminate (Gold on Blue)Gandhi road, Ahmedabad10$1.00$0.90$2.35
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/material_toggle.html b/application/views/admin/material_toggle.html new file mode 100644 index 0000000..47b33d6 --- /dev/null +++ b/application/views/admin/material_toggle.html @@ -0,0 +1,1401 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Toggles
+
+ +
+
+
+
+
+
+
Checkbox
+
+
+ + + + + + + + + + + +
Default CheckBoxCheckBox with Ripple EffectDisabled CheckBox
+ + + + + +
+
+
+
+
+
+
+
+
+
Radio Button
+
+
+ + + + + + + + + + + +
Default Radio ButtonRadio Button with Ripple EffectDisabled Radio Button
+ + + + + +
+
+
+
+
+
+
+
+
+
Icon Button
+
+
+ + + + + + + + + + + +
On IconOff IconDisabled Icon
+ + + + + +
+
+
+
+
+
+
+
+
+
Switch
+
+
+ + + + + + + + + + + +
On SwitchOff SwitchDisabled Switch
+ + + + + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/menu/list.php b/application/views/admin/menu/list.php new file mode 100644 index 0000000..5d30486 --- /dev/null +++ b/application/views/admin/menu/list.php @@ -0,0 +1,97 @@ + + + load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Menu List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Menu
+ +
+
+

Select menus to show in sidebar

+ +
+ num_rows()>0) + { + $i=1; + foreach($men->result() as $s) + { + $id=$s->id; + $name=$s->name; + $icon=$s->icon; + ?> +
+
+ + +
+ + + +
+ + + + +
+ + +
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + \ No newline at end of file diff --git a/application/views/admin/orders/list.php b/application/views/admin/orders/list.php new file mode 100644 index 0000000..64b9393 --- /dev/null +++ b/application/views/admin/orders/list.php @@ -0,0 +1,249 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Orders List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Orders
+ +
+
+ +
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($ord->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + + $a_color="#fd653b"; + } + } + + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + //customer details + $tables="users"; + $wheres=array("id"=>$user_id); + $shows=("*"); + $custname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($custname->num_rows()>0){ + $c=$custname->row(); + $custname_name=$c->name; + + + } + ?> + + + + + + + + + + + + + + + + + + + +
S no Customer Name Agent Name Category Policy Date Status
+
+ +
+ +
+ +
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + \ No newline at end of file diff --git a/application/views/admin/page-404.html b/application/views/admin/page-404.html new file mode 100644 index 0000000..289bba4 --- /dev/null +++ b/application/views/admin/page-404.html @@ -0,0 +1,62 @@ + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + +
+
+
+
+ + + Error 404 + +

The page you are looking for does't exist or an other error occurred.

+
+ +
+ +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/page-500.html b/application/views/admin/page-500.html new file mode 100644 index 0000000..7f9bff0 --- /dev/null +++ b/application/views/admin/page-500.html @@ -0,0 +1,62 @@ + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + +
+
+
+
+ + + Error 500 + +

Oops, Something went wrong.

+
+ +
+ +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/patient_profile.html b/application/views/admin/patient_profile.html new file mode 100644 index 0000000..279039b --- /dev/null +++ b/application/views/admin/patient_profile.html @@ -0,0 +1,1471 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Patient Profile
+
+ +
+
+
+
+
+
+ +
+
+
+

ABOUT PATIENT

+
+
+
+ +
+
Name +

Pankaj Rai

+
+
Occupation +

Engineer

+
+
+ +
+ +
+
Email ID +

pankaj@gmail.com

+
+
Phone +

+123 456 789

+
+
+ +
+ +
+
Address +

345, Sarju Appt., Mota Varacha, Surat +
Gujarat, India.

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

It is also used to identify any abnormal tissue in the uterine cavity, such as uterine fibroids, + endometrial polyps, scar tissue, or retained pregnancy tissue, the presence of which may be suggested by + history or previous tests such as a hysterosalpingogram (x-ray of the uterus and tubes). This procedure is + done in the office here at IVF New England, and is done by one of the physicians.

+

Approximately an hour before the exam we suggest that you take Ibuprofen 600 mg (Motrin/Advil) or a + similar medication to minimize some mild to moderate cramping that you may experience during the procedure. +

+
+
+
+

General Report

+
+
Heart Beat 85
+
+
40% Complete (success) +
+
+
Blood Pressure93
+
+
50% Complete
+
+
Sugar55
+
+
50% Complete
+
+
Haemoglobin78%
+
+
50% Complete
+
+
+
+
+
+
+
+
+
+
+
Past Visit History
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DateDoctorTreatmentChartCharges($)Action
11/05/2017Dr.RajeshCheck up +
+
14$ + + + +
13/05/2017Dr.RajeshX-Ray +
+
16$ + + + +
13/05/2017Dr.RajeshBlood Test +
+
24$ + + + +
14/05/2017Dr.RajeshAdmit +
+
14$ + + + +
15/05/2017Dr.RajeshOperation +
+
14$ + + + +
18/05/2017Dr.RajeshDischarge +
+
14$ + + + +
+
+
+
+
+
+
+
+
+

ECG Report

+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/payments.html b/application/views/admin/payments.html new file mode 100644 index 0000000..8385bd4 --- /dev/null +++ b/application/views/admin/payments.html @@ -0,0 +1,1462 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Hospital Payments
+
+ +
+
+
+
+
+
+
+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bill No Patient Doctor Date Charges Tax Discount Total
111Jenish ShahDR. John Deo12 Jan 2012510$10%5$340$
112Priya PatelDr.Rajesh12 Jan 2012239$10%5$358$
113Mayank JaniDr.Rajesh12 Jan 2012456$10%5$340$
114Priya PatelDR. John Deo12 Jan 2012510$10%5$358$
115Jenish ShahDr.Rajesh12 Jan 2012239$10%5$340$
116Priya PatelDr.Rajesh12 Jan 2012456$10%5$358$
117Mayank JaniDR. John Deo12 Jan 2012510$10%5$423$
118Priya PatelDr.Rajesh12 Jan 2012239$10%5$340$
119Mayank JaniDR. John Deo12 Jan 2012510$10%5$423$
120Jenish ShahDR. Megha Trivedi12 Jan 2012510$10%5$358$
121Priya PatelDr.Rajesh12 Jan 2012239$10%5$340$
122Jayna SharmaDR. Megha Trivedi12 Jan 2012510$10%5$423$
123Jenish ShahDr.Rajesh12 Jan 2012239$10%5$358$
124Jayna SharmaDR. Megha Trivedi12 Jan 2012127$10%5$423$
125Sonali MalikDr.Rajesh12 Jan 2012510$10%5$340$
126Jayna SharmaDR. John Deo12 Jan 2012510$10%5$423$
127Sonali MalikDR. Megha Trivedi12 Jan 2012127$10%5$358$
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/policy/add.php b/application/views/admin/policy/add.php new file mode 100644 index 0000000..1818270 --- /dev/null +++ b/application/views/admin/policy/add.php @@ -0,0 +1,394 @@ + + + +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Policy Add
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Add Policy
+ +
+
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
+
+
+
+
+ + + +
+
+ + + +
+
+
+ +
+ + +
+ +
+ + +
+
+ + +
+ +
+ + +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/policy/edit.php b/application/views/admin/policy/edit.php new file mode 100644 index 0000000..3c5fc29 --- /dev/null +++ b/application/views/admin/policy/edit.php @@ -0,0 +1,486 @@ + + +load->model('Policy_model'); ?> +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Policy Edit
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Edit Policy
+ +
+ num_rows()>0) + { + $s=$pol->row(); + $id=$s->id; + $name=$s->name; + $image=$s->image; + $company=$s->company; + $category=$s->category; + $catname=$s->catname; + $cmpname=$s->cmpname; + $intro=$s->intro; + $amount=$s->amount; + $amount_period=$s->amount_period; + $guarantee=$s->guarantee; + $policy_period=$s->policy_period; + $benefits=$s->benefits; + $specializations=$s->specializations; + $max_cover_age=$s->max_cover_age; + $is_this_top_plan=$s->is_this_top_plan; + $life_cover=$s->life_cover; + $claimed_settlement=$s->claimed_settlement; + + $pp=explode(" ", $policy_period); + $ppnumber=$pp[0]; + $ppperiod=$pp[1]; + $g=explode(" ", $guarantee); + $gnumber=$g[0]; + $gperiod=$g[1]; + if($life_cover!=""){ + $lc=explode(" ", $life_cover); + $lcnumber=$lc[0]; + $lcperiod=$lc[1]; + } + else + { + $lcnumber=""; + $lcperiod=""; + } + $com=$CI->Policy_model->get_compare_master($category); + + } + ?> +
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ + + +
+
+ + +
+
+
+
+
+
+ + + +
+
+ + + +
+
+
+ +
+ + checked value="" autocomplete="off" class="form-control" > +
+ +
+ + +
+
+ + +
+ +
+
+
+
+ + +
+ +
+
+
+ +
+
+ +
+
+
+ + +
+
+
+ +
+
+ +
+
+
+
+
+
+ + + +
+ +
+
+
+ +
+
+ +
+
+
+ + +
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+ + + + + +
+ num_rows()>0) + { + $p=1; + foreach($cmp_det->result() as $s) + { + $primary=$s->id; + $pricpid=$s->compare; + $compare_name=$s->compare_name; + $comparedetail=$s->comparedetail; + ?> +
+
+ +
+ +
+
+ +
+
+ +
+
+
+ + +
+
+ +
+ +
+
+ +
+
+ +
+
+
+ +
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + + + \ No newline at end of file diff --git a/application/views/admin/policy/list.php b/application/views/admin/policy/list.php new file mode 100644 index 0000000..32d6752 --- /dev/null +++ b/application/views/admin/policy/list.php @@ -0,0 +1,205 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Policy List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Policy
+ +
+
+
+ + + +
+
+ + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($pol->result() as $s) + { + $id=$s->id; + $name=$s->name; + $image=$s->image; + $catname=$s->catname; + $cmpname=$s->cmpname; + ?> + + + + + + + + + + + + +
S no Name Company Category Image
+
+
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + diff --git a/application/views/admin/policy/view.php b/application/views/admin/policy/view.php new file mode 100644 index 0000000..321c165 --- /dev/null +++ b/application/views/admin/policy/view.php @@ -0,0 +1,262 @@ + + + +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Policy View
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
View Policy
+ +
+ num_rows()>0) + { + $s=$pol->row(); + $id=$s->id; + $name=$s->name; + $image=$s->image; + $catname=$s->catname; + $cmpname=$s->cmpname; + $intro=$s->intro; + $amount=$s->amount; + $amount_period=$s->amount_period; + $guarantee=$s->guarantee; + $policy_period=$s->policy_period; + $benefits=$s->benefits; + $specializations=$s->specializations; + $max_cover_age=$s->max_cover_age; + $is_this_top_plan=$s->is_this_top_plan; + $life_cover=$s->life_cover; + $claimed_settlement=$s->claimed_settlement; + if($is_this_top_plan=="1"){ + $is_this_tp="Yes"; $color="green"; + } + else + { + $is_this_tp="No"; $color="red"; + } + } + ?> +
+
+ + +
+
+ +
+

()

+
From
+

+
+ +
+

Introduction

+

+

Policy Amount :

+ +

Policy Period :

+ +

Guarantee :

+

Life Cover :

+

Claim Settlement : %

+

Max Age Limit : Yrs

+

Is this top plan :

+

Benefits

+ +

+ +
+
+ + +

Specialization

+ +

+ +

Policy Comparision Details

+ + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($cmp_det->result() as $s) + { + $compid=$s->compare; + $compare_name=$s->compare_name; + $comparedetail=$s->comparedetail; + + ?> + + + + + + + + + + + + +
S no Compare Field Details
+
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + + + + + + \ No newline at end of file diff --git a/application/views/admin/profile.php b/application/views/admin/profile.php new file mode 100644 index 0000000..a669150 --- /dev/null +++ b/application/views/admin/profile.php @@ -0,0 +1,106 @@ +load->view('admin/includes/header'); +$user_id=$this->session->userdata('id'); +$email=$this->session->userdata('email'); +$mobile=$this->session->userdata('mobile'); +$username=$this->session->userdata('name');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Staff Profile
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+ +
+
+
+ +
+
+
Admin
+
+
    +
  • + Email +
  • +
  • + Mobile +
  • + +
+ + +
+
+ +
+ + +
+
+
+
+
+
+
Edit Profile
+ + +
+
+ $user_id); + $showField = array('username','password'); + $user_result=$this->commonsql_model->selectTable($table,$whereData,$showField); + if($user_result->num_rows()>0){ + $result=$user_result->row(); + + $password=$result->password; + $log_user_name=$result->username; + + } + ?> +
+
+ + +
+
+ + + + +
+ + +
+
+
+ + +
+
+
+ +
+
+
+
+
+ + +
+ + load->view('admin/includes/footer');?> \ No newline at end of file diff --git a/application/views/admin/profile.txt b/application/views/admin/profile.txt new file mode 100644 index 0000000..9df4504 --- /dev/null +++ b/application/views/admin/profile.txt @@ -0,0 +1,1500 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Staff Profile
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
Jayna Patil
+
Nurse
+
+
    +
  • + Followers 1,345 +
  • +
  • + Following 345 +
  • +
  • + Friends 6,142 +
  • +
+ + +
+ + +
+ +
+
+
+
+
About Me
+
+
+
+ Hello I am Kiran Patel a Nurse in Sanjivni Hospital Surat. I love to work with all my hospital staff and + seniour doctors. +
+
    +
  • + Gender +
    Female
    +
  • +
  • + Degree +
    BSN,MSN
    +
  • +
  • + Designation +
    Nurse
    +
  • +
+
+
+
37
+
Projects
+
+
+
51
+
Tasks
+
+
+
61
+
Uploads
+
+
+
+
+
+
+
Address
+
+
+
+
+

456, Pragri flat, varacha road, Surat +
Gujarat, India.

+
+
+
+
+
+ + +
+
+
+
+ +
+ +
+ +
+
+
+
+
Full Name +
+

Jayna Patil

+
+
Mobile +
+

(123) 456 7890

+
+
Email +
+

jaynapatil@example.com

+
+
Location +
+

India

+
+
+
+

Completed my post graduation Master of Science in Nursing(MSN) from the well known and + renowned institution of India – SARDAR PATEL NURSING COLLEGE, BARODA in 2000-01, which was affiliated to + Gujarat University, Ahmedabad,India. I ranker in University exams from the same university from 1996-01.

+

Worked as Professor and Head of the department ; Community medicine Department at Sterline Hospital, + Rajkot, Gujarat from 2003-2015

+

And I was lucky to train in a collegial environment where we called most of our attendings by their + first names. If only doctors did it that way outside the Midwest. One of my attendings even made the + argument that it is safer for patient care because it’s easier for subordinates to raise concerns when + they’re not verbally kowtowing to their superior. I never respected a white-haired surgeon any less when + I addressed him by his first name. In fact, I saw that in non-clinical science, it is commonplace for + the most junior researchers to call the most celebrated senior scientists by their first names.

+

When I offer or recommend products, I do so because I have actively researched them and find they are + the best in that category for your health. I ignore substandard products, and products not directly + pertinent to your health, regardless of any potential financial upsid

+
+

Education

+
+
    +
  • M.S.N.,Gujarat University, Ahmedabad,India.
  • +
  • B.S.N.,Gujarat University, Ahmedabad, India.
  • +
  • A.S.D.,Shaurashtra University, Rajkot, India
  • +
+
+

Experience

+
+
    +
  • One year nursing internship from April-2009 to march-2010 at B. J. Medical College, Ahmedabad.
  • +
  • I have worked as a part time Nursing in Apang manav mandal from 1st june 2004 to 31st jan 2005.
  • +
  • 2.5 Years Worked at Mahatma Gandhi General Hospital, Surendranagar.
  • +
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+
+
+
    +
  • +
    + +
    +
    +
    Rajesh Uploaded 3 new photos
    +

    7 minutes ago near Alaska, USA

    + +
    +
  • +
  • +
    + +
    +
    +
    John Doe attended a meeting with + Lina Smith.
    +

    2 days ago near Alaska, USA

    +
    +
  • +
  • +
    + +
    +
    +
    Kehn Anderson completed the task “wireframe design” within the dead line
    +

    4 days ago near Alaska, USA

    +
    +
  • +
  • +
    + +
    +
    +
    Jacob Ryan was absent office due to sickness
    +

    4 days ago near Alaska, USA

    +
    +
  • +
+
+
+
+
+
+
+
+
+ +
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/role/list.php b/application/views/admin/role/list.php new file mode 100644 index 0000000..56ce7d1 --- /dev/null +++ b/application/views/admin/role/list.php @@ -0,0 +1,137 @@ +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Role List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Role
+ +
+
+ +
+ + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($role->result() as $r) + { + $roleid=$r->id; + $rolename=$r->name; + ?> + + + + + + + + +
S no Name Action
+ + + + + + +
+
+
+
+
+
+
+ + +
+
+
+
+
+
Add Role
+ +
+
+
+
+ + +
+ + + +
+ +
+
+
+
+
+ +
+
+
+
+ + +load->view('admin/includes/footer');?> + + \ No newline at end of file diff --git a/application/views/admin/role/roleaction.php b/application/views/admin/role/roleaction.php new file mode 100644 index 0000000..9eabf5b --- /dev/null +++ b/application/views/admin/role/roleaction.php @@ -0,0 +1,67 @@ + +num_rows()>0) { + $rm=$role->row(); + $role_id= $rm->id; + $role_name= $rm->name; + }?> + + 'form-horizontal','id'=>'form_add','enctype'=>"multipart/form-data"));?> +
+
+
+
+
+
+ +
+
+ + +
+
+ + +num_rows()>0) { + $rm=$role->row(); + $role_id= $rm->id; + $role_name= $rm->name; + }?> + + 'form-horizontal','id'=>'form_add','enctype'=>"multipart/form-data"));?> +
+
+
+ +
+

Are you sure you want to delete this ?

+
+
+ + +
+
+ + + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Alloted Rooms
+
+ +
+
+
+
+
+
+
+
+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Room No Room Type Patient Allotment Date Discharge Date Action
+ + 101DeluxPooja Patel11 Jan 201715 Jan 2017 + + + + + + +
+ + 201Super DeluxRahul Malhotra10 Jan 201713 Jan 2017 + + + + + + +
+ + 403GeneralPriya Jain11 Jan 201715 Jan 2017 + + + + + + +
+ + 103DeluxRadhika Patel13 Jan 201716 Jan 2017 + + + + + + +
+ + 302Super DeluxParas Mehta11 Jan 201715 Jan 2017 + + + + + + +
+ + 104ICUVishal Kumar09 Jan 201718 Jan 2017 + + + + + + +
+ + 101DeluxPooja Patel11 Jan 201715 Jan 2017 + + + + + + +
+ + 201Super DeluxRahul Malhotra10 Jan 201713 Jan 2017 + + + + + + +
+ + 403GeneralPriya Jain11 Jan 201715 Jan 2017 + + + + + + +
+ + 103DeluxRadhika Patel13 Jan 201716 Jan 2017 + + + + + + +
+ + 302Super DeluxParas Mehta11 Jan 201715 Jan 2017 + + + + + + +
+ + 104ICUVishal Kumar09 Jan 201718 Jan 2017 + + + + + + +
+ + 101DeluxPooja Patel11 Jan 201715 Jan 2017 + + + + + + +
+ + 201Super DeluxRahul Malhotra10 Jan 201713 Jan 2017 + + + + + + +
+ + 403GeneralPriya Jain11 Jan 201715 Jan 2017 + + + + + + +
+ + 103DeluxRadhika Patel13 Jan 201716 Jan 2017 + + + + + + +
+ + 302Super DeluxParas Mehta11 Jan 201715 Jan 2017 + + + + + + +
+ + 104ICUVishal Kumar09 Jan 201718 Jan 2017 + + + + + + +
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/schedule.html b/application/views/admin/schedule.html new file mode 100644 index 0000000..e2cc705 --- /dev/null +++ b/application/views/admin/schedule.html @@ -0,0 +1,1296 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Doctor Schedule
+
+ +
+
+
+
+
+
+
+
+ Calendar
+
+
+
+
+
+
+
+
+ Draggable Events
+
+
+
+ +
+ Add Schedule +
+
+
+ +
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/sign_up.html b/application/views/admin/sign_up.html new file mode 100644 index 0000000..ba614aa --- /dev/null +++ b/application/views/admin/sign_up.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + +
+
+
+
+ + + Registration + +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+ +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/slider/add.php b/application/views/admin/slider/add.php new file mode 100644 index 0000000..78b4a54 --- /dev/null +++ b/application/views/admin/slider/add.php @@ -0,0 +1,94 @@ +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Slider Add
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Add Slider
+ +
+
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + \ No newline at end of file diff --git a/application/views/admin/slider/edit.php b/application/views/admin/slider/edit.php new file mode 100644 index 0000000..b2fad46 --- /dev/null +++ b/application/views/admin/slider/edit.php @@ -0,0 +1,108 @@ +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Slider Edit
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Add Slider
+ +
+ num_rows()>0) + { + $s=$slider->row(); + $id=$s->id; + $title=$s->title; + $subtitle=$s->subtitle; + $image=$s->image; + } + ?> +
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + \ No newline at end of file diff --git a/application/views/admin/slider/list.php b/application/views/admin/slider/list.php new file mode 100644 index 0000000..e06bd6f --- /dev/null +++ b/application/views/admin/slider/list.php @@ -0,0 +1,214 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Slider List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Slider
+ +
+
+
+ + + +
+
+ + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($slider->result() as $s) + { + $id=$s->id; + $title=$s->title; + $subtitle=$s->subtitle; + $image=$s->image; + $enable_disable=$s->status; + ?> + + + + + + + + + + + +
S no Title Subtitle Image Edit Action
+ + + + + + +
+
+
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + diff --git a/application/views/admin/staff/add.php b/application/views/admin/staff/add.php new file mode 100644 index 0000000..5a17498 --- /dev/null +++ b/application/views/admin/staff/add.php @@ -0,0 +1,135 @@ + + + +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Staff Add
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Add Staff
+ +
+
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ + +
+
+
+ + + + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + \ No newline at end of file diff --git a/application/views/admin/staff/edit.php b/application/views/admin/staff/edit.php new file mode 100644 index 0000000..6a9b7b0 --- /dev/null +++ b/application/views/admin/staff/edit.php @@ -0,0 +1,140 @@ + + + +load->view('admin/includes/header');?> +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Staff Edit
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Edit Staff
+ +
+ num_rows()>0) + { + $s=$staff->row(); + $id=$s->id; + $name=$s->name; + $roles=$s->role; + $mobile=$s->mobile; + $rolename=$s->rolename; + $email=$s->email; + $username=$s->username; + $password=$s->password; + }?> +
+ +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+
+ checked > + +
+
+
+
style="display:block" > +
+
+ + +
+
+ + + +
+
+
+ + + + +
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + + + + \ No newline at end of file diff --git a/application/views/admin/staff/list.php b/application/views/admin/staff/list.php new file mode 100644 index 0000000..d359550 --- /dev/null +++ b/application/views/admin/staff/list.php @@ -0,0 +1,242 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Staff List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Staff
+ +
+
+
+ + + +
+
+ + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($staff->result() as $s) + { + $id=$s->id; + $name=$s->name; + $mobile=$s->mobile; + $rolename=$s->rolename; + + $email=$s->email; + ?> + + + + + + + + + + + + + +
S no Name Role Mobile Email Action
+ + + + + + +
+
+
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + + diff --git a/application/views/admin/staff_profile.html b/application/views/admin/staff_profile.html new file mode 100644 index 0000000..9df4504 --- /dev/null +++ b/application/views/admin/staff_profile.html @@ -0,0 +1,1500 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Staff Profile
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
Jayna Patil
+
Nurse
+
+
    +
  • + Followers 1,345 +
  • +
  • + Following 345 +
  • +
  • + Friends 6,142 +
  • +
+ + +
+ + +
+ +
+
+
+
+
About Me
+
+
+
+ Hello I am Kiran Patel a Nurse in Sanjivni Hospital Surat. I love to work with all my hospital staff and + seniour doctors. +
+
    +
  • + Gender +
    Female
    +
  • +
  • + Degree +
    BSN,MSN
    +
  • +
  • + Designation +
    Nurse
    +
  • +
+
+
+
37
+
Projects
+
+
+
51
+
Tasks
+
+
+
61
+
Uploads
+
+
+
+
+
+
+
Address
+
+
+
+
+

456, Pragri flat, varacha road, Surat +
Gujarat, India.

+
+
+
+
+
+ + +
+
+
+
+ +
+ +
+ +
+
+
+
+
Full Name +
+

Jayna Patil

+
+
Mobile +
+

(123) 456 7890

+
+
Email +
+

jaynapatil@example.com

+
+
Location +
+

India

+
+
+
+

Completed my post graduation Master of Science in Nursing(MSN) from the well known and + renowned institution of India – SARDAR PATEL NURSING COLLEGE, BARODA in 2000-01, which was affiliated to + Gujarat University, Ahmedabad,India. I ranker in University exams from the same university from 1996-01.

+

Worked as Professor and Head of the department ; Community medicine Department at Sterline Hospital, + Rajkot, Gujarat from 2003-2015

+

And I was lucky to train in a collegial environment where we called most of our attendings by their + first names. If only doctors did it that way outside the Midwest. One of my attendings even made the + argument that it is safer for patient care because it’s easier for subordinates to raise concerns when + they’re not verbally kowtowing to their superior. I never respected a white-haired surgeon any less when + I addressed him by his first name. In fact, I saw that in non-clinical science, it is commonplace for + the most junior researchers to call the most celebrated senior scientists by their first names.

+

When I offer or recommend products, I do so because I have actively researched them and find they are + the best in that category for your health. I ignore substandard products, and products not directly + pertinent to your health, regardless of any potential financial upsid

+
+

Education

+
+
    +
  • M.S.N.,Gujarat University, Ahmedabad,India.
  • +
  • B.S.N.,Gujarat University, Ahmedabad, India.
  • +
  • A.S.D.,Shaurashtra University, Rajkot, India
  • +
+
+

Experience

+
+
    +
  • One year nursing internship from April-2009 to march-2010 at B. J. Medical College, Ahmedabad.
  • +
  • I have worked as a part time Nursing in Apang manav mandal from 1st june 2004 to 31st jan 2005.
  • +
  • 2.5 Years Worked at Mahatma Gandhi General Hospital, Surendranagar.
  • +
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+
+
+
    +
  • +
    + +
    +
    +
    Rajesh Uploaded 3 new photos
    +

    7 minutes ago near Alaska, USA

    + +
    +
  • +
  • +
    + +
    +
    +
    John Doe attended a meeting with + Lina Smith.
    +

    2 days ago near Alaska, USA

    +
    +
  • +
  • +
    + +
    +
    +
    Kehn Anderson completed the task “wireframe design” within the dead line
    +

    4 days ago near Alaska, USA

    +
    +
  • +
  • +
    + +
    +
    +
    Jacob Ryan was absent office due to sickness
    +

    4 days ago near Alaska, USA

    +
    +
  • +
+
+
+
+
+
+
+
+
+ +
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/sweet_alert.html b/application/views/admin/sweet_alert.html new file mode 100644 index 0000000..e4e9479 --- /dev/null +++ b/application/views/admin/sweet_alert.html @@ -0,0 +1,1357 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Sweet Alert
+
+ +
+
+
+
+
+
+
Sweet Alert
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Alert TypeExample
Basic Example + +
Title with a text under + +
Success message! + +
Warning message + +
By passing a parameter, you can execute something else for "Cancel". + +
Message with custom Image Header + +
Message with auto close timer + +
An HTML message + +
A replacement for the prompt function + +
With a loader (for AJAX request for example) + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/tableData.html b/application/views/admin/tableData.html new file mode 100644 index 0000000..ab7a63d --- /dev/null +++ b/application/views/admin/tableData.html @@ -0,0 +1,1276 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Table With Javascript Data
+
+ +
+
+
+
+
+
+
Javascript sourced data
+
+ + + +
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/testimonial/add.php b/application/views/admin/testimonial/add.php new file mode 100644 index 0000000..cabf002 --- /dev/null +++ b/application/views/admin/testimonial/add.php @@ -0,0 +1,114 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Testimonial Add
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Add Testimonial
+ +
+
+ +
+
+ + +
+
+ + +
+
+
+ +
+ + +
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + \ No newline at end of file diff --git a/application/views/admin/testimonial/edit.php b/application/views/admin/testimonial/edit.php new file mode 100644 index 0000000..ae6fd4d --- /dev/null +++ b/application/views/admin/testimonial/edit.php @@ -0,0 +1,129 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Testimonial Edit
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Edit Testimonial
+ +
+ num_rows()>0) + { + $s=$tes->row(); + $id=$s->id; + $name=$s->name; + $image=$s->image; + + $intro=$s->message; + + + } + ?> +
+ +
+
+ + +
+
+ + + +
+
+
+ + +
+ + +
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +load->view('admin/includes/footer');?> + + + + + \ No newline at end of file diff --git a/application/views/admin/testimonial/list.php b/application/views/admin/testimonial/list.php new file mode 100644 index 0000000..d5ca3f8 --- /dev/null +++ b/application/views/admin/testimonial/list.php @@ -0,0 +1,218 @@ + +load->view('admin/includes/header');?> + +
+ load->view('admin/includes/sidebar');?> + +
+
+
+
+
+
Testimonial List
+
+ +
+
+ load->view('admin/includes/msg');?> +
+
+
+
+
+
+
Testimonial
+ +
+
+
+ + + +
+
+ + + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($tes->result() as $s) + { + $id=$s->id; + $name=$s->name; + + $image=$s->image; + $intro=$s->message; + $enable_disable=$s->status; + ?> + + + + + + + + + + + + + +
S no Name Image Message Edit Action
+ + + + + + +
+
+
+
+
+
+
+ + +
+
+
+
+ +load->view('admin/includes/footer');?> + + diff --git a/application/views/admin/ui_buttons.html b/application/views/admin/ui_buttons.html new file mode 100644 index 0000000..682d797 --- /dev/null +++ b/application/views/admin/ui_buttons.html @@ -0,0 +1,1923 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Buttons
+
+ +
+
+
+
+
+
+
Default Buttons
+
+
+
+
+ + + + + + +
+

Disable buttons

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

Outline Buttons

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

Buttons Size

+
+
+
+
+ + + + +
+
+
+
+
+
+
+
+
Rounded Buttons
+
+
+
+
+ + + + + + +
+

Disable Rounded Buttons

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

Outline Rounded Buttons

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

Rounded Buttons Size

+
+
+
+
+ + + + +
+
+
+
+
+
+
+
+
+
+
Group Buttons
+
+
+
+
+
+ + + +
+
+ + + +
+
+

Vertical buttons groups

+
+
+
+
+
+ + + +
+
+

Group Checkbox

+
+
+
+
+
+ + + +
+
+

Multiple buttons group

+
+
+
+
+
+
+ + + + +
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
Rounded Group Buttons
+
+
+
+
+
+ + + +
+
+ + + +
+
+

Vertical buttons groups

+
+
+
+
+
+ + + +
+
+

Group Checkbox

+
+
+
+
+
+ + + +
+
+

Multiple buttons group

+
+
+
+
+
+
+ + + + +
+
+ + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
Buttons With Icons
+
+
+
+
+ + + + + + +
+
+
+
+
+
+
+
+
Rounded Buttons With Icons
+
+
+
+
+ + + + + + +
+
+
+
+
+
+
+
+
+
+
Dropdowns Buttons
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+
+
+
+
+
Rounded Buttons With Icons
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+
+
+
+
+
+
+
Split Dropdowns Button
+
+
+
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+
+
+
+
+
+
Split Dropdowns Rounded Button
+
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+
+
+
+
+
+
+
Block level button
+
+
+ + + +
+
+
+
+
+
+
Star Rating Example
+
+
+ +
+
+
+
+
+
+
+
+
SOCIAL BUTTONS
+
+
+
+ + + + + + + + + + + + + +
+ + + + + + + + + + + + + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/ui_carousel.html b/application/views/admin/ui_carousel.html new file mode 100644 index 0000000..01530ac --- /dev/null +++ b/application/views/admin/ui_carousel.html @@ -0,0 +1,1308 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Responsive Carousel Slider
+
+ +
+
+
+
+ +
+
+
+
+

One More Example

+
+
+
+
+ +
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/ui_grid.html b/application/views/admin/ui_grid.html new file mode 100644 index 0000000..7017c1e --- /dev/null +++ b/application/views/admin/ui_grid.html @@ -0,0 +1,1431 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Grids
+
+ +
+
+
+
+ +
+
+

Base on Bootstrap grid system. +

+
+
+
col-lg-12
+
+
+
+
+
+
+
col-lg-6
+
+
+
+
+
col-lg-6
+
+
+
+
+
+
+
col-lg-4
+
+
+
+
+
col-lg-4
+
+
+
+
+
col-lg-4
+
+
+
+
+
+
+
col-lg-3
+
+
+
+
+
col-lg-3
+
+
+
+
+
col-lg-3
+
+
+
+
+
col-lg-3
+
+
+
+
+
+
+
col-lg-2
+
+
+
+
+
col-lg-2
+
+
+
+
+
col-lg-2
+
+
+
+
+
col-lg-2
+
+
+
+
+
col-lg-2
+
+
+
+
+
col-lg-2
+
+
+
+
+
+

Mobile, tablet, and desktop

+
+
+
+
+
+
+
+
col-xs-6
+
+
+
+
+
col-xs-6
+
+
+
+
+
+
+
col-lg-8
+
+
+
+
+
+
+
+
+
col-sm-6
+
+
+
+
+
col-sm-6
+
+
+
+
+
+
+
col-lg-6
+
+
+
+
+
+
+
+
+
col-md-6
+
+
+
+
+
col-md-6
+
+
+
+
+
+
+
col-lg-4
+
+
+
+
+
+
+
col-sm-6
+
+
+
+
+
col-sm-6
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/ui_icons.html b/application/views/admin/ui_icons.html new file mode 100644 index 0000000..0c15d9f --- /dev/null +++ b/application/views/admin/ui_icons.html @@ -0,0 +1,3804 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Font Icons
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ fa fa-address-book +
+
+ fa fa-address-book-o +
+
+ fa fa-address-card +
+
+ fa fa-address-card-o +
+
+ fa fa-bandcamp +
+
+ fa fa-bath +
+
+ fa fa-bathtub +
+
+ fa fa-drivers-license +
+
+ fa fa-drivers-license-o +
+
+ fa fa-eercast +
+
+ fa fa-envelope-open +
+
+ fa fa-envelope-open-o +
+
+ fa fa-etsy +
+
+ fa fa-free-code-camp +
+
+ fa fa-grav +
+
+ fa fa-handshake-o +
+
+ fa fa-id-badge +
+
+ fa fa-id-card +
+
+ fa fa-id-card-o +
+
+ fa fa-imdb +
+
+ fa fa-linode +
+
+ fa fa-meetup +
+
+ fa fa-microchip +
+
+ fa fa-podcast +
+
+ fa fa-quora +
+
+ fa fa-ravelry +
+
+ fa fa-s15 +
+
+ fa fa-shower +
+
+ fa fa-snowflake-o +
+
+ fa fa-superpowers +
+
+ fa fa-telegram +
+
+ fa fa-thermometer +
+
+ fa fa-thermometer-0 +
+
+ fa fa-thermometer-1 +
+
+ fa fa-thermometer-2 +
+
+ fa fa-thermometer-3 +
+
+ fa fa-thermometer-4 +
+
+ fa fa-thermometer-empty +
+
+ fa fa-thermometer-full +
+
+ fa fa-thermometer-half +
+
+ fa fa-thermometer-quarter +
+
+ fa + fa-thermometer-three-quarters +
+
+ fa fa-times-rectangle +
+
+ fa fa-times-rectangle-o +
+
+ fa fa-user-circle +
+
+ fa fa-user-circle-o +
+
+ fa fa-user-o +
+
+ fa fa-vcard +
+
+ fa fa-vcard-o +
+
+ fa fa-window-close +
+
+ fa fa-window-close-o +
+
+ fa fa-window-maximize +
+
+ fa fa-window-minimize +
+
+ fa fa-window-restore +
+
+ fa fa-wpexplorer +
+
+
+
+ +
+
+ fa-adjust
+
+ fa-anchor
+
+ fa-archive
+
+ fa-arrows
+
+ fa-arrows-h
+
+ fa-arrows-v
+
+ fa-asterisk
+
+ fa-automobile (alias) +
+
+ fa-ban
+
+ fa-bank (alias) +
+
+ fa-bar-chart-o
+
+ fa-barcode
+
+ fa-bars
+
+ fa-beer
+
+ fa-bell
+
+ fa-bell-o
+
+ fa-bolt
+
+ fa-bomb
+
+ fa-book
+
+ fa-bookmark
+
+ fa-bookmark-o
+
+ fa-briefcase
+
+ fa-bug
+
+ fa-building
+
+ fa-building-o
+
+ fa-bullhorn
+
+ fa-bullseye
+
+ fa-cab (alias) +
+
+ fa-calendar
+
+ fa-calendar-o
+
+ fa-camera
+
+ fa-camera-retro
+
+ fa-car
+
+ fa-caret-square-o-down
+
+ fa-caret-square-o-left
+
+ fa-caret-square-o-right
+
+ fa-caret-square-o-up
+
+ fa-certificate
+
+ fa-check
+
+ fa-check-circle
+
+ fa-check-circle-o
+
+ fa-check-square
+
+ fa-check-square-o
+
+ fa-child
+
+ fa-circle
+
+ fa-circle-o
+
+ fa-circle-o-notch
+
+ fa-circle-thin
+
+ fa-clock-o
+
+ fa-cloud
+
+ fa-cloud-download
+
+ fa-cloud-upload
+
+ fa-code
+
+ fa-code-fork
+
+ fa-coffee
+
+ fa-cog
+
+ fa-cogs
+
+ fa-comment
+
+ fa-comment-o
+
+ fa-comments
+
+ fa-comments-o
+
+ fa-compass
+
+ fa-credit-card
+
+ fa-crop
+
+ fa-crosshairs
+
+ fa-cube
+
+ fa-cubes
+
+ fa-cutlery
+
+ fa-dashboard (alias) +
+
+ fa-database
+
+ fa-desktop
+
+ fa-dot-circle-o
+
+ fa-download
+
+ fa-edit (alias) +
+
+ fa-ellipsis-h
+
+ fa-ellipsis-v
+
+ fa-envelope
+
+ fa-envelope-o
+
+ fa-envelope-square
+
+ fa-eraser
+
+ fa-exchange
+
+ fa-exclamation
+
+ fa-exclamation-circle
+
+ fa-exclamation-triangle
+
+ fa-external-link
+
+ fa-external-link-square
+
+ fa-eye
+
+ fa-eye-slash
+
+ fa-fax
+
+ fa-female
+
+ fa-fighter-jet
+
+ fa-file-archive-o
+
+ fa-file-audio-o
+
+ fa-file-code-o
+
+ fa-file-excel-o
+
+ fa-file-image-o
+
+ fa-file-movie-o (alias) +
+
+ fa-file-pdf-o
+
+ fa-file-photo-o (alias) +
+
+ fa-file-picture-o (alias) +
+
+ fa-file-powerpoint-o
+
+ fa-file-sound-o (alias) +
+
+ fa-file-video-o
+
+ fa-file-word-o
+
+ fa-file-zip-o (alias) +
+
+ fa-film
+
+ fa-filter
+
+ fa-fire
+
+ fa-fire-extinguisher
+
+ fa-flag
+
+ fa-flag-checkered
+
+ fa-flag-o
+
+ fa-flash (alias) +
+
+ fa-flask
+
+ fa-folder
+
+ fa-folder-o
+
+ fa-folder-open
+
+ fa-folder-open-o
+
+ fa-frown-o
+
+ fa-gamepad
+
+ fa-gavel
+
+ fa-gear (alias) +
+
+ fa-gears (alias) +
+
+ fa-gift
+
+ fa-glass
+
+ fa-globe
+
+ fa-graduation-cap
+
+ fa-group (alias) +
+
+ fa-hdd-o
+
+ fa-headphones
+
+ fa-heart
+
+ fa-heart-o
+
+ fa-history
+
+ fa-home
+
+ fa-image (alias) +
+
+ fa-inbox
+
+ fa-info
+
+ fa-info-circle
+
+ fa-institution (alias) +
+
+ fa-key
+
+ fa-keyboard-o
+
+ fa-language
+
+ fa-laptop
+
+ fa-leaf
+
+ fa-legal (alias) +
+
+ fa-lemon-o
+
+ fa-level-down
+
+ fa-level-up
+
+ fa-life-bouy (alias) +
+
+ fa-life-ring
+
+ fa-life-saver (alias) +
+
+ fa-lightbulb-o
+
+ fa-location-arrow
+
+ fa-lock
+
+ fa-magic
+
+ fa-magnet
+
+ fa-mail-forward (alias) +
+
+ fa-mail-reply (alias) +
+
+ fa-mail-reply-all (alias) +
+
+ fa-male
+
+ fa-map-marker
+
+ fa-meh-o
+
+ fa-microphone
+
+ fa-microphone-slash
+
+ fa-minus
+
+ fa-minus-circle
+
+ fa-minus-square
+
+ fa-minus-square-o
+
+ fa-mobile
+
+ fa-mobile-phone (alias) +
+
+ fa-money
+
+ fa-moon-o
+
+ fa-mortar-board (alias) +
+
+ fa-music
+
+ fa-navicon (alias) +
+
+ fa-paper-plane
+
+ fa-paper-plane-o
+
+ fa-paw
+
+ fa-pencil
+
+ fa-pencil-square
+
+ fa-pencil-square-o
+
+ fa-phone
+
+ fa-phone-square
+
+ fa-photo (alias) +
+
+ fa-picture-o
+
+ fa-plane
+
+ fa-plus
+
+ fa-plus-circle
+
+ fa-plus-square
+
+ fa-plus-square-o
+
+ fa-power-off
+
+ fa-print
+
+ fa-puzzle-piece
+
+ fa-qrcode
+
+ fa-question
+
+ fa-question-circle
+
+ fa-quote-left
+
+ fa-quote-right
+
+ fa-random
+
+ fa-recycle
+
+ fa-refresh
+
+ fa-reorder (alias) +
+
+ fa-reply
+
+ fa-reply-all
+
+ fa-retweet
+
+ fa-road
+
+ fa-rocket
+
+ fa-rss
+
+ fa-rss-square
+
+ fa-search
+
+ fa-search-minus
+
+ fa-search-plus
+
+ fa-send (alias) +
+
+ fa-send-o (alias) +
+
+ fa-share
+
+ fa-share-alt
+
+ fa-share-alt-square
+
+ fa-share-square
+
+ fa-share-square-o
+
+ fa-shield
+
+ fa-shopping-cart
+
+ fa-sign-in
+
+ fa-sign-out
+
+ fa-signal
+
+ fa-sitemap
+
+ fa-sliders
+
+ fa-smile-o
+
+ fa-sort
+
+ fa-sort-alpha-asc
+
+ fa-sort-alpha-desc
+
+ fa-sort-amount-asc
+
+ fa-sort-amount-desc
+
+ fa-sort-asc
+
+ fa-sort-desc
+
+ fa-sort-down (alias) +
+
+ fa-sort-numeric-asc
+
+ fa-sort-numeric-desc
+
+ fa-sort-up (alias) +
+
+ fa-space-shuttle
+
+ fa-spinner
+
+ fa-spoon
+
+ fa-square
+
+ fa-square-o
+
+ fa-star
+
+ fa-star-half
+
+ fa-star-half-empty (alias) +
+
+ fa-star-half-full (alias) +
+
+ fa-star-half-o
+
+ fa-star-o
+
+ fa-suitcase
+
+ fa-sun-o
+
+ fa-support (alias) +
+
+ fa-tablet
+
+ fa-tachometer
+
+ fa-tag
+
+ fa-tags
+
+ fa-tasks
+
+ fa-taxi
+
+ fa-terminal
+
+ fa-thumb-tack
+
+ fa-thumbs-down
+
+ fa-thumbs-o-down
+
+ fa-thumbs-o-up
+
+ fa-thumbs-up
+
+ fa-ticket
+
+ fa-times
+
+ fa-times-circle
+
+ fa-times-circle-o
+
+ fa-tint
+
+ fa-toggle-down (alias) +
+
+ fa-toggle-left (alias) +
+
+ fa-toggle-right (alias) +
+
+ fa-toggle-up (alias) +
+
+ fa-trash-o
+
+ fa-tree
+
+ fa-trophy
+
+ fa-truck
+
+ fa-umbrella
+
+ fa-university
+
+ fa-unlock
+
+ fa-unlock-alt
+
+ fa-unsorted (alias) +
+
+ fa-upload
+
+ fa-user
+
+ fa-users
+
+ fa-video-camera
+
+ fa-volume-down
+
+ fa-volume-off
+
+ fa-volume-up
+
+ fa-warning (alias) +
+
+ fa-wheelchair
+
+ fa-wrench
+
+
+
+ +
+
+ + fa-american-sign-language-interpreting +
+
+ fa-asl-interpreting +
+
+ + fa-assistive-listening-systems +
+
+ fa-audio-description +
+
+ fa-blind +
+
+ fa-braille +
+
+ fa-cc +
+
+ fa-deaf +
+
+ fa-deafness +
+
+ fa-hard-of-hearing +
+
+ fa-low-vision +
+
+ fa-question-circle-o +
+
+ fa-sign-language +
+
+ fa-signing +
+
+ fa-tty +
+
+ fa-universal-access +
+
+ fa-volume-control-phone +
+
+ fa-wheelchair +
+
+ fa-wheelchair-alt +
+
+
+
+ +
+
+ fa-hand-grab-o +
+
+ fa-hand-lizard-o +
+
+ fa-hand-o-down +
+
+ fa-hand-o-left +
+
+ fa-hand-o-right +
+
+ fa-hand-o-up +
+
+ fa-hand-paper-o +
+
+ fa-hand-peace-o +
+
+ fa-hand-pointer-o +
+
+ fa-hand-rock-o +
+
+ fa-hand-scissors-o +
+
+ fa-hand-spock-o +
+
+ fa-hand-stop-o +
+
+ fa-thumbs-down +
+
+ fa-thumbs-o-down +
+
+ fa-thumbs-o-up +
+
+ fa-thumbs-up +
+
+
+
+ +
+
+ fa-ambulance
+
+ fa-automobile + (alias) +
+
+ fa-bicycle
+
+ fa-bus
+
+ fa-cab + (alias) +
+
+ fa-car
+
+ fa-fighter-jet
+
+ fa-motorcycle
+
+ fa-plane
+
+ fa-rocket
+
+ fa-ship
+
+ fa-space-shuttle
+
+ fa-subway
+
+ fa-taxi
+
+ fa-train
+
+ fa-truck
+
+ fa-wheelchair
+
+ wheelchair-alt
+
+
+
+ +
+
+ fa-genderless
+
+ fa-intersex + (alias) +
+
+ fa-mars
+
+ fa-mars-double
+
+ fa-mars-stroke
+
+ fa-mars-stroke-h
+
+ fa-mars-stroke-v
+
+ fa-mercury
+
+ fa-neuter
+
+ fa-transgender
+
+ fa-transgender-alt
+
+ fa-venus
+
+ fa-venus-double
+
+ fa-venus-mars
+
+
+
+ +
+
+ fa-file
+
+ fa-file-archive-o
+
+ fa-file-audio-o
+
+ fa-file-code-o
+
+ fa-file-excel-o
+
+ fa-file-image-o
+
+ fa-file-movie-o + (alias) +
+
+ fa-file-o
+
+ fa-file-pdf-o
+
+ fa-file-photo-o + (alias) +
+
+ fa-file-picture-o + (alias) +
+
+ fa-file-powerpoint-o
+
+ fa-file-sound-o + (alias) +
+
+ fa-file-text
+
+ fa-file-text-o
+
+ fa-file-video-o
+
+ fa-file-word-o
+
+ fa-file-zip-o + (alias) +
+
+
+
+ +
+
    +
  • + These icons work + great with the fa-spin class.
  • +
+
+
+
+ fa-circle-o-notch
+
+ fa-cog
+
+ fa-gear + (alias) +
+
+ fa-refresh
+
+ fa-spinner
+
+
+
+ +
+
+ fa-check-square
+
+ fa-check-square-o
+
+ fa-circle
+
+ fa-circle-o
+
+ fa-dot-circle-o
+
+ fa-minus-square
+
+ fa-minus-square-o
+
+ fa-plus-square
+
+ fa-plus-square-o
+
+ fa-square
+
+ fa-square-o
+
+
+
+ +
+
+ fa-cc-amex
+
+ fa-cc-diners-club
+
+ fa-cc-discover
+
+ fa-cc-jcb
+
+ fa-cc-mastercard
+
+ fa-cc-paypal
+
+ fa-cc-stripe
+
+ fa-cc-visa
+
+ fa-credit-card
+
+ fa-credit-card-alt
+
+ fa-google-wallet
+
+ fa-paypal
+
+
+
+ +
+
+ area-chart
+
+ fa-bar-chart
+
+ fa-bar-chart-o + (alias) +
+
+ fa-line-chart
+
+ fa-pie-chart
+
+
+
+ +
+
+ fa-bitcoin + (alias) +
+
+ fa-btc
+
+ fa-cny + (alias) +
+
+ fa-dollar + (alias) +
+
+ fa-eur
+
+ fa-euro + (alias) +
+
+ fa-gbp
+
+ fa-gg
+
+ fa-gg-circle
+
+ fa-ils
+
+ fa-inr
+
+ fa-jpy
+
+ fa-krw
+
+ fa-money
+
+ fa-rmb + (alias) +
+
+ fa-rouble + (alias) +
+
+ fa-rub
+
+ fa-ruble + (alias) +
+
+ fa-rupee + (alias) +
+
+ fa-shekel + (alias) +
+
+ fa-sheqel + (alias) +
+
+ fa-try
+
+ fa-turkish-lira + (alias) +
+
+ fa-usd
+
+ fa-won + (alias) +
+
+ fa-yen + (alias) +
+
+
+
+ +
+
+ fa-align-center
+
+ fa-align-justify
+
+ fa-align-left
+
+ fa-align-right
+
+ fa-bold
+
+ fa-chain + (alias) +
+
+ fa-chain-broken
+
+ fa-clipboard
+
+ fa-columns
+
+ fa-copy + (alias) +
+
+ fa-cut + (alias) +
+
+ fa-dedent + (alias) +
+
+ fa-eraser
+
+ fa-file
+
+ fa-file-o
+
+ fa-file-text
+
+ fa-file-text-o
+
+ fa-files-o
+
+ fa-floppy-o
+
+ fa-font
+
+ fa-header
+
+ fa-indent
+
+ fa-italic
+
+ fa-link
+
+ fa-list
+
+ fa-list-alt
+
+ fa-list-ol
+
+ fa-list-ul
+
+ fa-outdent
+
+ fa-paperclip
+
+ fa-paragraph
+
+ fa-paste + (alias) +
+
+ fa-repeat
+
+ fa-rotate-left + (alias) +
+
+ fa-rotate-right + (alias) +
+
+ fa-save + (alias) +
+
+ fa-scissors
+
+ fa-strikethrough
+
+ fa-subscript
+
+ fa-superscript
+
+ fa-table
+
+ fa-text-height
+
+ fa-text-width
+
+ fa-th
+
+ fa-th-large
+
+ fa-th-list
+
+ fa-underline
+
+ fa-undo
+
+ fa-unlink + (alias) +
+
+
+
+ +
+
+ fa-angle-double-down
+
+ fa-angle-double-left
+
+ fa-angle-double-right
+
+ fa-angle-double-up
+
+ fa-angle-down
+
+ fa-angle-left
+
+ fa-angle-right
+
+ fa-angle-up
+
+ fa-arrow-circle-down
+
+ fa-arrow-circle-left
+
+ fa-arrow-circle-o-down
+
+ fa-arrow-circle-o-left
+
+ fa-arrow-circle-o-right
+
+ fa-arrow-circle-o-up
+
+ fa-arrow-circle-right
+
+ fa-arrow-circle-up
+
+ fa-arrow-down
+
+ fa-arrow-left
+
+ fa-arrow-right
+
+ fa-arrow-up
+
+ fa-arrows
+
+ fa-arrows-alt
+
+ fa-arrows-h
+
+ fa-arrows-v
+
+ fa-caret-down
+
+ fa-caret-left
+
+ fa-caret-right
+
+ fa-caret-square-o-down
+
+ fa-caret-square-o-left
+
+ fa-caret-square-o-right
+
+ fa-caret-square-o-up
+
+ fa-caret-up
+
+ fa-chevron-circle-down
+
+ fa-chevron-circle-left
+
+ fa-chevron-circle-right
+
+ fa-chevron-circle-up
+
+ fa-chevron-down
+
+ fa-chevron-left
+
+ fa-chevron-right
+
+ fa-chevron-up
+
+ fa-exchange
+
+ fa-hand-o-down
+
+ fa-hand-o-left
+
+ fa-hand-o-right
+
+ fa-hand-o-up
+
+ fa-long-arrow-down
+
+ fa-long-arrow-left
+
+ fa-long-arrow-right
+
+ fa-long-arrow-up
+
+ fa-toggle-down + (alias) +
+
+ fa-toggle-left + (alias) +
+
+ fa-toggle-right + (alias) +
+
+ fa-toggle-up + (alias) +
+
+
+
+ +
+
+ fa-arrows-alt
+
+ fa-backward
+
+ fa-compress
+
+ fa-eject
+
+ fa-expand
+
+ fa-fast-backward
+
+ fa-fast-forward
+
+ fa-forward
+
+ fa-pause
+
+ fa-play
+
+ fa-play-circle
+
+ fa-play-circle-o
+
+ fa-random
+
+ fa-step-backward
+
+ fa-step-forward
+
+ fa-stop
+
+ fa-youtube-play
+
+
+
+ +
+

+ Warning!

Apparently, Adblock + Plus can remove Font Awesome brand icons with their "Remove Social + Media Buttons" setting. We will not use hacks to force them to display. + Please report an issue with Adblock Plus if you believe this to be an + error. To work around this, you'll need to modify the social icon class + names. +
+
+
+ fa-500px
+
+ fa-adn
+
+ fa-amazon
+
+ fa-android
+
+ fa-angellist
+
+ fa-apple
+
+ fa-behance
+
+ fa-behance-square
+
+ fa-bitbucket
+
+ fa-bitbucket-square
+
+ fa-bitcoin + (alias) +
+
+ fa-black-tie
+
+ fa-btc
+
+ fa-buysellads
+
+ fa-cc-amex
+
+ fa-cc-diners-club
+
+ fa-cc-discover
+
+ fa-cc-jcb
+
+ fa-cc-mastercard
+
+ fa-cc-paypal
+
+ fa-cc-stripe
+
+ fa-cc-visa
+
+ fa-chrome
+
+ fa-codepen
+
+ fa-connectdevelop
+
+ fa-contao
+
+ fa-css3
+
+ fa-dashcube
+
+ fa-delicious
+
+ fa-deviantart
+
+ fa-digg
+
+ fa-dribbble
+
+ fa-dropbox
+
+ fa-drupal
+
+ fa-empire
+
+ fa-expeditedssl
+
+ fa-facebook
+
+ fa-facebook-f + (alias) +
+
+ fa-facebook-official
+
+ fa-facebook-square
+
+ fa-firefox
+
+ fa-flickr
+
+ fa-fonticons
+
+ fa-forumbee
+
+ fa-foursquare
+
+ fa-ge + (alias) +
+
+ fa-get-pocket
+
+ fa-gg
+
+ fa-gg-circle
+
+ fa-git
+
+ fa-git-square
+
+ fa-github
+
+ fa-github-alt
+
+ fa-github-square
+
+ fa-gittip + (alias) +
+
+ fa-google
+
+ fa-google-plus
+
+ fa-google-plus-square
+
+ fa-google-wallet
+
+ fa-gratipay
+
+ fa-hacker-news
+
+ fa-houzz
+
+ fa-html5
+
+ fa-instagram
+
+ fa-internet-explorer
+
+ fa-ioxhost
+
+ fa-joomla
+
+ fa-jsfiddle
+
+ fa-lastfm
+
+ fa-lastfm-square
+
+ fa-leanpub
+
+ fa-linkedin
+
+ fa-linkedin-square
+
+ fa-linux
+
+ fa-maxcdn
+
+ fa-meanpath
+
+ fa-medium
+
+ fa-odnoklassniki
+
+ fa-odnoklassniki-square
+
+ fa-opencart
+
+ fa-openid
+
+ fa-opera
+
+ fa-optin-monster
+
+ fa-pagelines
+
+ fa-paypal
+
+ fa-pied-piper
+
+ fa-pied-piper-alt
+
+ fa-pinterest
+
+ fa-pinterest-p
+
+ fa-pinterest-square
+
+ fa-qq
+
+ fa-ra + (alias) +
+
+ fa-rebel
+
+ fa-reddit
+
+ fa-reddit-square
+
+ fa-renren
+
+ fa-safari
+
+ fa-sellsy
+
+ fa-share-alt
+
+ fa-share-alt-square
+
+ fa-shirtsinbulk
+
+ fa-simplybuilt
+
+ fa-skyatlas
+
+ fa-skype
+
+ fa-slack
+
+ fa-slideshare
+
+ fa-soundcloud
+
+ fa-spotify
+
+ fa-stack-exchange
+
+ fa-stack-overflow
+
+ fa-steam
+
+ fa-steam-square
+
+ fa-stumbleupon
+
+ fa-stumbleupon-circle
+
+ fa-tencent-weibo
+
+ fa-trello
+
+ fa-tripadvisor
+
+ fa-tumblr
+
+ fa-tumblr-square
+
+ fa-twitch
+
+ fa-twitter
+
+ fa-twitter-square
+
+ fa-viacoin
+
+ fa-vimeo
+
+ fa-vimeo-square
+
+ fa-vine
+
+ fa-vk
+
+ fa-wechat + (alias) +
+
+ fa-weibo
+
+ fa-weixin
+
+ fa-whatsapp
+
+ fa-wikipedia-w
+
+ fa-windows
+
+ fa-wordpress
+
+ fa-xing
+
+ fa-xing-square
+
+ fa-y-combinator
+
+ fa-y-combinator-square + (alias) +
+
+ fa-yahoo
+
+ fa-yc + (alias) +
+
+ fa-yc-square + (alias) +
+
+ fa-yelp
+
+ fa-youtube
+
+ fa-youtube-play
+
+ fa-youtube-square
+
+
+
    +
  • All brand icons are trademarks of their respective owners. +
  • +
  • The use of these trademarks does not indicate endorsement of + the trademark holder by Font Awesome, nor vice versa.
  • +
  • Brand icons should only be used to represent the company or + product to which they refer.
  • +
  • Please do not use brand logos for any purpose + except to represent that particular brand or service. +
  • +
+
+
+
+ +
+
+ fa-ambulance
+
+ fa-h-square
+
+ fa-heart
+
+ fa-heart-o
+
+ fa-heartbeat
+
+ fa-hospital-o
+
+ fa-medkit
+
+ fa-plus-square
+
+ fa-stethoscope
+
+ fa-user-md
+
+ fa-wheelchair
+
+ fa-wheelchair-alt
+
+
+
+
+
+ +
+  .icon-user + +  .icon-people + +  .icon-user-female + +  .icon-user-follow + + +  .icon-user-following + + +  .icon-user-unfollow + +  .icon-login + +  .icon-logout + +  .icon-emotsmile + +  .icon-phone + +  .icon-call-end + +  .icon-call-in + +  .icon-call-out + +  .icon-map + +  .icon-location-pin + +  .icon-direction + +  .icon-directions + +  .icon-compass + +  .icon-layers + +  .icon-menu + +  .icon-list + + +  .icon-options-vertical + +  .icon-options + +  .icon-arrow-down + +  .icon-arrow-left + +  .icon-arrow-right + +  .icon-arrow-up + + +  .icon-arrow-up-circle + + +  .icon-arrow-left-circle + + +  .icon-arrow-right-circle + + +  .icon-arrow-down-circle + +  .icon-check + +  .icon-clock + +  .icon-plus + +  .icon-minus + +  .icon-close + +  .icon-event + +  .icon-exclamation + +  .icon-organization + +  .icon-trophy + + +  .icon-screen-smartphone + + +  .icon-screen-desktop + +  .icon-plane + +  .icon-notebook + +  .icon-mustache + +  .icon-mouse + +  .icon-magnet + +  .icon-energy + +  .icon-disc + +  .icon-cursor + +  .icon-cursor-move + +  .icon-crop + +  .icon-chemistry + +  .icon-speedometer + +  .icon-shield + + +  .icon-screen-tablet + +  .icon-magic-wand + +  .icon-hourglass + +  .icon-graduation + +  .icon-ghost + + +  .icon-game-controller + +  .icon-fire + +  .icon-eyeglass + + +  .icon-envelope-open + + +  .icon-envelope-letter + +  .icon-bell + +  .icon-badge + +  .icon-anchor + +  .icon-wallet + +  .icon-vector + +  .icon-speech + +  .icon-puzzle + +  .icon-printer + +  .icon-present + +  .icon-playlist + +  .icon-pin + +  .icon-picture + +  .icon-handbag + +  .icon-globe-alt + +  .icon-globe + +  .icon-folder-alt + +  .icon-folder + +  .icon-film + +  .icon-feed + +  .icon-drop + +  .icon-drawer + +  .icon-docs + +  .icon-doc + +  .icon-diamond + +  .icon-cup + +  .icon-calculator + +  .icon-bubbles + +  .icon-briefcase + +  .icon-book-open + + +  .icon-basket-loaded + +  .icon-basket + +  .icon-bag + +  .icon-action-undo + +  .icon-action-redo + +  .icon-wrench + +  .icon-umbrella + +  .icon-trash + +  .icon-tag + +  .icon-support + +  .icon-frame + + +  .icon-size-fullscreen + +  .icon-size-actual + +  .icon-shuffle + +  .icon-share-alt + +  .icon-share + +  .icon-rocket + +  .icon-question + +  .icon-pie-chart + +  .icon-pencil + +  .icon-note + +  .icon-loop + +  .icon-home + +  .icon-grid + +  .icon-graph + +  .icon-microphone + + +  .icon-music-tone-alt + +  .icon-music-tone + + +  .icon-earphones-alt + +  .icon-earphones + +  .icon-equalizer + +  .icon-like + +  .icon-dislike + + +  .icon-control-start + + +  .icon-control-rewind + +  .icon-control-play + + +  .icon-control-pause + + +  .icon-control-forward + +  .icon-control-end + +  .icon-volume-1 + +  .icon-volume-2 + +  .icon-volume-off + +  .icon-calendar + +  .icon-bulb + +  .icon-chart + +  .icon-ban + +  .icon-bubble + +  .icon-camrecorder + +  .icon-camera + + +  .icon-cloud-download + +  .icon-cloud-upload + +  .icon-envelope + +  .icon-eye + +  .icon-flag + +  .icon-heart + +  .icon-info + +  .icon-key + +  .icon-link + +  .icon-lock + +  .icon-lock-open + +  .icon-magnifier + + +  .icon-magnifier-add + + +  .icon-magnifier-remove + +  .icon-paper-clip + +  .icon-paper-plane + +  .icon-power + +  .icon-refresh + +  .icon-reload + +  .icon-settings + +  .icon-star + + +  .icon-symbol-female + +  .icon-symbol-male + +  .icon-target + +  .icon-credit-card + +  .icon-paypal + + +  .icon-social-tumblr + + +  .icon-social-twitter + + +  .icon-social-facebook + + +  .icon-social-instagram + + +  .icon-social-linkedin + + +  .icon-social-pinterest + + +  .icon-social-github + + +  .icon-social-google + + +  .icon-social-reddit + +  .icon-social-skype + + +  .icon-social-dribbble + + +  .icon-social-behance + + +  .icon-social-foursqare + + +  .icon-social-soundcloud + + +  .icon-social-spotify + + +  .icon-social-stumbleupon + + +  .icon-social-youtube + + +  .icon-social-dropbox + + +  .icon-social-vkontakte + +  .icon-social-steam + + +
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/ui_modal.html b/application/views/admin/ui_modal.html new file mode 100644 index 0000000..e1cc247 --- /dev/null +++ b/application/views/admin/ui_modal.html @@ -0,0 +1,1641 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Modals
+
+ +
+
+ +
+
+
+
+
Basic Modal Example
+
+
+
+

Basic example

+

Click the button to trigger Modal.

+ +
+
+
+
+
+ + + +
+
+
+
+
Center In Page
+
+
+
+

Center In Page

+

Add .modal-dialog-centered to .modal-dialog + to vertically center the modal.

+ +
+
+
+
+
+ + + +
+
+
+
+
Modals Size
+
+
+
+

Modals Size

+

To change the position or size of the modal add one of the following classes to the .modal-dialog + div.

+

Note: Medium size is a default value, so there isn't a dedicated class for it.

+

.modal-sm Small Modal

+

.modal-lg Large Modal

+

.modal-fluid Full Width Modal

+ + + + +
+
+
+
+
+ + + + + + + + + + +
+
+
+
+
Modals Positions
+
+
+
+

Modals Positions

+

Note: To make it works properly, apart from adding a class for a position, you also need + to addspecial class.modal-side to.modal-dialog div.

+

.modal-side .modal-top-right Top Right

+

.modal-side .modal-top-left Top Left

+

.modal-side .modal-bottom-right Bottom Right

+

.modal-side .modal-bottom-left Bottom Left

+ + + + +
+
+
+
+
+ + + + + + + + + + +
+
+
+
+
Scrolling long content
+
+
+
+

Scrolling long content

+

Click the button to trigger Modal.

+ +
+
+
+
+
+ + +
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/ui_panels.html b/application/views/admin/ui_panels.html new file mode 100644 index 0000000..f37b5ae --- /dev/null +++ b/application/views/admin/ui_panels.html @@ -0,0 +1,1438 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Panels
+
+ +
+
+
+
+

Panel with heading

+
+
+
+
+ Panel Title
+
Content goes here.
+
+
+
+
+
+ Panel Title
+
Content goes here.
+
+
+
+
+
+
+
+
+
+
+
+ Panel Title
+
Content goes here.
+
+
+
+
+
+ Panel Title
+
Content goes here.
+
+
+
+
+
+
+
+
+
+
+
+ Panel Title
+
Content goes here.
+
+
+
+
+
+ Panel Title
+
Content goes here.
+
+
+
+
+
+
+
+
+
+
Panel Title
+
+
Content goes here.
+
+
+
+
+
+

Panel with heading and buttons

+
+
+
+
+
Panel Title
+
+ + + +
+
+
Content goes here.
+
+
+
+
+
+
Panel Title
+
+ + + +
+
+
Content goes here.
+
+
+
+
+
+
+
+
+
+
+
+
Panel Title
+
+ + + +
+
+
Content goes here.
+
+
+
+
+
+
Panel Title
+
+ + + +
+
+
Content goes here.
+
+
+
+
+
+
+
+
+
+
+
+
Panel Title
+
+ + + +
+
+
Content goes here.
+
+
+
+
+
+
Panel Title
+
+ + + +
+
+
Content goes here.
+
+
+
+
+
+
+
+
+
+
Panel Title
+
+ + + +
+
+
+ Content goes here. +
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/ui_tabs_accordions_navs.html b/application/views/admin/ui_tabs_accordions_navs.html new file mode 100644 index 0000000..76e076b --- /dev/null +++ b/application/views/admin/ui_tabs_accordions_navs.html @@ -0,0 +1,1675 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Tabs & Accordions
+
+ +
+
+
+
+
+
+ +
+
+
+
+

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the + industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and + scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into + electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release + of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like + Aldus PageMaker including versions of Lorem Ipsum..

+

Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

You'll. His have you'll day make beginning good, herb. Can't place lights was evening let his itself. His + seas unto replenish may every said midst him. Night to air behold tree years sixth waters. Unto together + can't darkness sixth heaven it. Fruit. Image. Winged, a own.

+

The waters multiply were male. Wherein gathering replenish gathering blessed dry called second. It + Beginning whose you every dry them midst don't place you're sixth he above hath, fish sea fifth. Brought + called.

+

Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

It is a long established fact that a reader will be distracted by the readable content of a page when + looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of + letters, as opposed to using 'Content here, content here', making it look like readable English.

+

Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

You'll. His have you'll day make beginning good, herb. Can't place lights was evening let his itself. His + seas unto replenish may every said midst him. Night to air behold tree years sixth waters. Unto together + can't darkness sixth heaven it. Fruit. Image. Winged, a own.

+

Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+
+
+
+
+
+
+
+ borderBox Tabs +
+ +
+
+
+
+

Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore + eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent.

+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore + et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. + Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+

+

+
+
+

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut + labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea + rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor + sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+

+ Click here +

+
+
+

You'll. His have you'll day make beginning good, herb. Can't place lights was evening let his itself. His + seas unto replenish may every said midst him. Night to air behold tree years sixth waters. Unto together + can't darkness sixth heaven it. Fruit. Image. Winged, a own. The waters multiply were male. Wherein + gathering replenish gathering blessed dry called second. It Beginning whose you every dry them midst don't + place you're sixth he above hath, fish sea fifth. Brought called. +

+ Click here + +

+
+
+
+
+
+
+
+
+
+
+
LEFT TABS
+
+ + + +
+
+
+
+
+ +
+
+
+
+

Lorem ipsum dolor sit amet, sumo impetus ea sit, ut pri mucius eruditi dolorum. Wisi liberavisse + theophrastus mea cu, id enim elit erroribus nec. Et ridens fuisset volumus mel. Te duo prompta lucilius + suavitate, viderer ocurreret ea ius.

+
+
+

Doming conclusionemque sed ex, invenire ocurreret dissentiet his no. Ius cu novum assueverit, eam ex + dolor molestiae theophrastus. Ex sed alii dolorum, et vis impetus expetendis dissentiunt. Vim ad soluta + admodum tibique, inermis salutandi at mei, mutat nominati eos id. Id aeque iudico sit, eros adolescens + est te.

+
+
+

Most of its text is made up from sections 1.10.32–3 of Cicero's De finibus bonorum et malorum (On the + Boundaries of Goods and Evils; finibus may also be translated as purposes).

+
+
+

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, + totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta + sunt, explicabo.

+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
Home
+
+

Lorem ipsum dolor sit amet, sumo impetus ea sit, ut pri mucius eruditi dolorum. Wisi liberavisse + theophrastus mea cu, id enim elit erroribus nec. Et ridens fuisset volumus mel. Te duo prompta lucilius + suavitate, viderer ocurreret ea ius.

+

Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam + rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, + explicabo.

+

Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit + amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna + aliquyam erat, sed diam voluptua. At vero eos et accusam et justo.

+
+
+
+
+
+
+
+
+
+
+
RIGHT TABS
+
+ + + +
+
+
+
+
+
+
+

Lorem ipsum dolor sit amet, sumo impetus ea sit, ut pri mucius eruditi dolorum. Wisi liberavisse + theophrastus mea cu, id enim elit erroribus nec. Et ridens fuisset volumus mel. Te duo prompta lucilius + suavitate, viderer ocurreret ea ius.

+
+
+

Doming conclusionemque sed ex, invenire ocurreret dissentiet his no. Ius cu novum assueverit, eam ex + dolor molestiae theophrastus. Ex sed alii dolorum, et vis impetus expetendis dissentiunt. Vim ad soluta + admodum tibique, inermis salutandi at mei, mutat nominati eos id. Id aeque iudico sit, eros adolescens + est te.

+
+
+

Most of its text is made up from sections 1.10.32–3 of Cicero's De finibus bonorum et malorum (On the + Boundaries of Goods and Evils; finibus may also be translated as purposes).

+
+
+

Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, + totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta + sunt, explicabo.

+
+
+
+
+ +
+
+
+
+
+
+
+
+
ACCORDIONS
+
+ + + +
+
+
+
+
+ +
+
+

HTML stands for HyperText Markup Language. HTML is the main markup language for describing the + structure of Web pages.

+
+
+
+
+ +
+
+

Bootstrap is a powerful front-end framework for faster and easier web development. It is a collection + of CSS and HTML conventions.

+

+ Activate + this section via URL +

+
+
+
+
+ +
+
+

CSS stands for Cascading Style Sheet. CSS allows you to specify various style properties for a given + HTML element such as colors, backgrounds, fonts etc.

+

+ Activate + this section via URL +

+
+
+
+
+ +
+
+

JavaScript is a programming language used to make web pages interactive. It runs on your visitor's + computer and doesn't require constant downloads from your website. JavaScript is often used to create + polls and quizzes.

+

+ Activate this + section via URL +

+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/ui_tree.html b/application/views/admin/ui_tree.html new file mode 100644 index 0000000..3b877d9 --- /dev/null +++ b/application/views/admin/ui_tree.html @@ -0,0 +1,2056 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Tree View
+
+ +
+
+ +
+
+
+
+
+
+ Default
+
+
+
+
+
+
+
+
+ Collapsed
+
+
+
+
+
+
+
+
+ Expanded
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blue Theme
+
+
+
+
+
+
+
+
+ Custom Icons
+
+
+
+
+
+
+
+
+ Tags as Badges
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No Border
+
+
+
+
+
+
+
+
+ Colourful
+
+
+
+
+
+
+
+
+ Node Overrides
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Link enabled
+
+
+
+
+
+
+
+
+ JSON Data
+
+
+
+
+
+
+
+
+
+
+
+
+ Searchable Tree
+
+
+
+

Input

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

Tree

+
+
+
+

Results

+
+
+
+
+
+
+
+
+
+
+
+ Selectable Tree
+
+
+
+

Input

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

Tree

+
+
+
+

Events

+
+
+
+
+
+
+
+
+
+
+
+ Expandible Tree
+
+
+
+

Input

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

Tree

+
+
+
+

Events

+
+
+
+
+
+
+
+
+
+
+
+ Checkable Tree
+
+
+
+

Input

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

Tree

+
+
+
+

Events

+
+
+
+
+
+
+
+
+
+
+
+ Disabled Tree
+
+
+
+

Input

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

Tree

+
+
+
+

Events

+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/ui_typography.html b/application/views/admin/ui_typography.html new file mode 100644 index 0000000..ef6e8b9 --- /dev/null +++ b/application/views/admin/ui_typography.html @@ -0,0 +1,1577 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Typography
+
+ +
+
+
+
+
+
+
HEADINGS
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+

h1. Heading 1

+
Light 36px
+

h2. Heading 2

+
Light 30px
+

h3. Heading 3

+
Light 23px
+

h4. Heading 4

+
Light 18px
+
h5. Heading 5
+
Light 14px
+
+
+
+
+
+
+
+
+
WEIGHT
+
+ + + +
+
+
+
+

Light text

+

Normal text

+

Medium text

+

Bold text

+

Ultra bold text

+
+
+
+
+
+
+ +
+
+

Lists

+
+
+
+

+ Lists are a part of everyday life.Here different types of lists available. +

+
+
+
+
+
+
UNORDERED LISTS
+
+ + + +
+
+
+
+
    +
  • first item
  • +
  • second item
  • +
  • Third item
  • +
  • Forth item
  • +
  • Fifth item +
      +
    • fifth item first subitem
    • +
    • fifth item second subitem
    • +
    • fifth item third subitem
    • +
    +
  • +
  • Sixth item
  • +
  • Seventh item
  • +
+
+
+
+
+
+
+
+
ORDERED LISTS
+
+ + + +
+
+
+
+
    +
  1. first item
  2. +
  3. second item
  4. +
  5. Third item
  6. +
  7. Forth item
  8. +
  9. Fifth item
  10. +
  11. Sixth item
  12. +
  13. Seventh item
  14. +
  15. Eighth item
  16. +
  17. Nineth item
  18. +
  19. Tenth item
  20. +
+
+
+
+
+
+
+
+
UNSTYLED LISTS
+
+ + + +
+
+
+
+
    +
  • first item
  • +
  • second item
  • +
  • Third item
  • +
  • Forth item
  • +
  • Fifth item +
      +
    • fifth item first subitem
    • +
    • fifth item second subitem
    • +
    • fifth item third subitem
    • +
    +
  • +
  • Sixth item
  • +
  • Seventh item
  • +
+
+
+
+
+
+
+
+
UNSTYLED LISTS
+
+ + + +
+
+
+
+
    +
  • first item
  • +
  • second item
  • +
  • Third item
  • +
  • Forth item
  • +
  • Fifth item
  • +
  • Sixth item
  • +
  • Seventh item
  • +
  • Eighth item
  • +
  • Nineth item
  • +
  • Tenth item
  • +
+
+
+
+
+
+ +
+
+
+

Lead Body

+
+
+
+

+ To add some emphasis to a paragraph, add class .lead. This will give you a larger font size, + lighter weight, and a taller line height. +

+
+
+
+
+

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. + Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante.

+

Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. + Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, + ornare sit amet, wisi.

+
+
+
+ +
+
+
+

Highlighted Text

+
+
+
+

+ For highlighting text <mark> tag can be a quick and easy way of highlighting or marking + text on a page. +

+
+
+
+
+

Pellentesque habitant morbi tristique senectus et netus et malesuada + fames ac turpis egestas libero sit amet quam egestas semper. Aenean ultricies mi.

+

+ Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. +
This line of text is meant to be treated as fine print. +

+
+
+
+ +
+
+
+

Bold Text

+
+
+
+

+ The HTML <b> element defines bold text, without any extra importance. +

+
+
+
+
+

+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit +

+
+
+
+ +
+
+
+

Deleted Text

+
+
+
+

+ The <del> tag defines text that has been deleted from a document. +

+
+
+
+
+

My favorite color is blue

+
+
+
+ +
+
+
+

Colored Text

+
+
+
+

+ Here is some classes used for color your text. +

+
+
+
+
+

Aliquam tincidunt mauris eu risus.

+

Lorem ipsum dolor sit amet.

+

Pellentesque habitant morbi tristique.

+

senectus et netus et malesuada fames ac turpis egestas.

+

Donec eu libero sit amet quam egestas semper.

+

Aenean ultricies mi vitae est.

+

Aliquam tincidunt mauris eu risus.

+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula.

+
+
+
+ +
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/user_profile.html b/application/views/admin/user_profile.html new file mode 100644 index 0000000..f670d2c --- /dev/null +++ b/application/views/admin/user_profile.html @@ -0,0 +1,1531 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
User Profile
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
Dr. Kiran Patel
+
Gynaecologist
+
+ + + +
+ + +
+ +
+
+
+
+
About Me
+
+
+
+ Hello I am Dave Gomache a web and user interface designer. I love to work with the application interface and + the web elements. +
+
    +
  • + Gender +
    Male
    +
  • +
  • + Project Done +
    30+
    +
  • +
  • + Skills +
    Java,Spring
    +
  • +
+
+
+
37
+
Projects
+
+
+
51
+
Tasks
+
+
+
61
+
Uploads
+
+
+
+
+ +
+
+
Work Progress
+
+
+
+
+
+
Operations
+
80%
+
+
+
+ 80% +
+
+
+
+
+
Consultation
+
55%
+
+
+
+ 55% +
+
+
+
+
+
Support
+
20%
+
+
+
+ 20% +
+
+
+
+
+
+
+ + +
+
+
+
+
+
User Activity
+
+
+
+
+
+
+
+ +
+
+ + +
+
+
+
+
+
+
    +
  • +
    + +
    +
    +
    Rajesh Uploaded 5 new photos
    +

    7 minutes ago near Alaska, USA

    + +
    +
  • +
  • +
    + +
    +
    +
    Sarah Smith Completed the Sight visit.
    +

    2 minutes ago near Alaska, USA

    +
    +
    +
    +
    +
  • +
  • +
    + +
    +
    +
    John Doe attended a meeting with + Lina Smith.
    +

    2 days ago near Alaska, USA

    +
    +
  • +
  • +
    + +
    +
    +
    Kehn Anderson completed the task “wireframe design” within the dead line
    +

    4 days ago near Alaska, USA

    +
    +
  • +
  • +
    + +
    +
    +
    Jacob Ryan was absent office due to sickness
    +

    4 days ago near Alaska, USA

    +
    +
  • +
+
+
+
+
+
+
+
+ +
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/validation_form.html b/application/views/admin/validation_form.html new file mode 100644 index 0000000..62d710b --- /dev/null +++ b/application/views/admin/validation_form.html @@ -0,0 +1,1504 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Form Validation
+
+ +
+
+
+
+
+
+
Validation States
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+

Basic validation States

+
+ +
+ + Success Message +
+
+
+ +
+ + Warning Message +
+
+
+ +
+ + Error Message +
+
+

Validation States With Icons

+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
Basic Validation
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+
+
+
+ +
+
+ + + +
+
+
+
+ +
+ + e.g: http://www.demo.com or http://demo.com +
+
+
+ +
+
+
+
+ +
+ + e.g: 5500 0000 0000 0004 +
+
+
+ +
+ + optional field +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
Validation with Icons
+ +
    +
  • assistant_photoAction
  • +
  • printAnother action
  • +
  • favoriteSomething else here
  • +
+
+
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+ e.g: http://www.demo.com or http://demo.com +
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+ e.g: 5500 0000 0000 0004 +
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/vector_maps.html b/application/views/admin/vector_maps.html new file mode 100644 index 0000000..c664cb0 --- /dev/null +++ b/application/views/admin/vector_maps.html @@ -0,0 +1,1357 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Vector Maps
+
+ +
+
+
+
+
+
+
+
+
World
+
+ + + +
+
+
+
+
+
+
+
+
+
+
USA
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Europe
+
+ + + +
+
+
+
+
+
+
+
+
+
+
Russia
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Germany
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/view_appointment.html b/application/views/admin/view_appointment.html new file mode 100644 index 0000000..c27deae --- /dev/null +++ b/application/views/admin/view_appointment.html @@ -0,0 +1,1992 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Appointment List
+
+ +
+
+
+
+
+
+
+
+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name Email Date Of Appointment From To Mobile Consulting Doctor Injury/Condition Action
+ + Jenish shah + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Pankaj Singh + jenish@gmail.com 12 Jan 201207:4508:00 + 444543564 Dr.Sarah SmithMalaria + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201208:1508:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Pankaj Singh + jenish@gmail.com 12 Jan 201208:4508:00 + 444543564 Dr.Sarah SmithMalaria + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201209:0009:15 + 444543564 Dr.RajeshFever + + + + + + +
+ + Pankaj Singh + jenish@gmail.com 12 Jan 201209:3009:45 + 444543564 Dr.Sarah SmithMalaria + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201209:4510:00 + 444543564 Dr.RajeshCholera + + + + + + +
+ + Pankaj Singh + jenish@gmail.com 12 Jan 201210:1510:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201211:1511:30 + 444543564 Dr.RajeshMalaria + + + + + + +
+ + Pankaj Singh + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Pankaj Singh + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.Jay SoniCholera + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshMalaria + + + + + + +
+ + Pankaj Singh + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.Jay SoniFever + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshCholera + + + + + + +
+ + Sneha Pandya + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshMalaria + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.Jay SoniFever + + + + + + +
+ + Sneha Pandya + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshCholera + + + + + + +
+ + Pooja Patel + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshMalaria + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Sneha Pandya + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshCholera + + + + + + +
+ + Sneha Pandya + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Pooja Patel + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshCholera + + + + + + +
+ + Sneha Pandya + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Pooja Patel + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshCholera + + + + + + +
+ + Jenish shah + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Sneha Pandya + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshFever + + + + + + +
+ + Pooja Patel + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshCholera + + + + + + +
+ + Sneha Pandya + jenish@gmail.com 12 Jan 201207:1507:30 + 444543564 Dr.RajeshFever + + + + + + +
+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/widget.html b/application/views/admin/widget.html new file mode 100644 index 0000000..573b312 --- /dev/null +++ b/application/views/admin/widget.html @@ -0,0 +1,2130 @@ + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Widgets
+
+ +
+
+ +
+
+
+
+
+
+

New Client

+
+
+
+ 14% higher than last month +
+
+
+
+
+
+

New Project

+
+
+
+ 7% higher than last month +
+
+
+
+
+
+

Open Project

+
+
+
+ 34% higher than last month +
+
+
+
+
+
+

Complete Project

+
+
+
+ 20% higher than last month +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+

0

+

APPOINTMENTS

+
+
+
+
+
+
+ +
+
+

0

+

NEW PATIENTS

+
+
+
+
+
+
+ +
+
+

0

+

TODAY'S OPT

+
+
+
+
+
+
+ +
+
+

0

$ +

Hospital Earning

+
+
+
+
+
+ +
+
+
+
user
+
+
June 16 + 56 +
+

White Woman Practices Yoga In

+

There is a new neighbor on Sesame Street. Her name is Julia

+ +
+
+
+
+
+
user
+
+
Feb 12 + 45 +
+

How Much Radon is In Your Home?

+

There is a new neighbor on Sesame Street. Her name is Julia

+ +
+
+
+
+
+
user
+
+
Dec 17 + 79 +
+

White Woman Practices Yoga In

+

There is a new neighbor on Sesame Street. Her name is Julia

+ +
+
+
+
+
+
user
+
+
April 23 + 654 +
+

How Much Radon is In Your Home?

+

There is a new neighbor on Sesame Street. Her name is Julia

+ +
+
+
+
+
+
+
+
+ group +
+ Appointments + 450 +
+
+
+ + 45% Increase in 28 Days + +
+ +
+ +
+ +
+
+ person +
+ New Patients + 155 +
+
+
+ + 40% Increase in 28 Days + +
+ +
+ +
+ +
+
+ content_cut +
+ Operations + 52 +
+
+
+ + 85% Increase in 28 Days + +
+ +
+ +
+ +
+
+ monetization_on +
+ Hospital Earning + 13,921$ +
+
+
+ + 50% Increase in 28 Days + +
+ +
+ +
+ +
+
+
+
+
+
+
CHAT
+
+ + + +
+
+
+
+
    +
  • +
    + Jone + Doe at Mar 12, 2014 6:12 Lorem ipsum dolor sit + amet, + consectetuer adipiscing elit +
    +
  • +
  • +
    + Kiran + Patel at Mar 12, 2014 6:13 sed diam nonummy nibh + euismod + tincidunt ut +
    +
  • +
  • +
    + Jone + Doe at Mar 12, 2014 6:12 aoreet dolore magna + aliquam erat + volutpat. +
    +
  • +
  • +
    + Kiran + Patel at Mar 12, 2014 6:13 sed diam nonummy nibh + euismod + tincidunt ut +
    +
  • +
  • +
    + Jone + Doe at Mar 12, 2014 6:12 aoreet dolore magna + aliquam erat + volutpat. +
    +
  • +
  • +
    + Kiran + Patel at Mar 12, 2014 6:13 sed diam nonummy nibh + +
    +
  • +
+ +
+
+
+
+
+
+
+
DOCTORS LIST
+
+ + + +
+
+
+
+
    +
  • +
    + +
    +
    +
    + Dr.Rajesh -(MBBS,MD) +
    +
    + Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Sarah Smith -(MBBS,DGO,MD) +
    +
    + Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.John Deo - (BDS,MDS) +
    +
    + Not Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Jay Soni - (BHMS) +
    +
    + On Leave +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Jacob Ryan - (MBBS,MS) +
    +
    + Not Available +
    +
    +
  • +
  • +
    + +
    +
    +
    + Dr.Megha Trivedi - (MBBS,MS) +
    +
    + Available +
    +
    +
  • +
+
+ View all +
+
+
+
+
+
+ +
+
+
+
+
ADMIT PATIENT LIST
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NoNameAssigned DoctorDate Of AdmitDiseasesRoom NoEdit
1Jens BrinckerDr.Kenny Josh27/05/2016 + Influenza + 101 +
2Mark HayDr. Mark26/05/2017 + Cholera + 105 +
3Anthony DavieDr.Cinnabar21/05/2016 + Amoebiasis + 106 +
4David PerryDr.Felix 20/04/2016 + Jaundice + 105 +
5Anthony DavieDr.Beryl24/05/2016 + Leptospirosis + 102 +
6Alan GilchristDr.Joshep22/05/2016 + Hepatitis + 103 +
7Mark HayDr.Jayesh18/06/2016 + Typhoid + 107 +
8Sue WoodgerDr.Sharma17/05/2016 + Malaria + 108 +
+
+
+
+
+
+ +
+ + +
+
+
+
+
TODO LIST
+
+ + + +
+
+
+
+
    +
  • +
    + + +
    +

    UI perfection testing for Mega Section +

    +
    + +
    +
  • +
  • +
    + + +
    +

    UI perfection testing for Mega Section +

    +
    + +
    +
  • +
  • +
    + + +
    +

    Wiget & Design placement

    +
    + +
    +
  • +
  • +
    + + +
    +

    Development & Wiget placement +

    +
    + +
    +
  • +
  • +
    + + +
    +

    Test Complete +

    +
    + +
    +
  • +
+
+ +
+
+
+ +
+
+
+
+
+ img +

Kiran Patel

+
info@kiranpatel.com
+
+
+
+
+
+
+

+

467

+
+
+

+

234

+
+
+

+

686

+
+
+
+
+
Contact info
123-456-7890 +
+
+
+
+
+
+
+
+
+

34% High + then last month Site Traffic

+
+
+
Overall Growth
40.40% +
+
+
Montly
55.40% +
+
+
Day
4.50% +
+
+
+
+
+
+
+

34% Low then + last monthSite Traffic

+
+
+
Overall Growth
40.40% +
+
+
Montly
55.40% +
+
+
Day
4.50% +
+
+
+
+
+
+
+

18% High + then last monthSite Traffic

+
+
+
Overall Growth
40.40% +
+
+
Montly
55.40% +
+
+
Day
4.50% +
+
+
+
+
+
+
+
+
+

Analysis 345

+
+
+
+
+
+

Sales 643

+
+
+
+
+
+

Site visits 765

+
+
+
+
+
+

New Patient 323

+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/admin/wizard_form.html b/application/views/admin/wizard_form.html new file mode 100644 index 0000000..98a083b --- /dev/null +++ b/application/views/admin/wizard_form.html @@ -0,0 +1,1366 @@ + + + + + + + + + + + + + Redstar Hospital | Bootstrap Responsive Hospital Admin Template + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+ + +
+ + +
+ + + + +
+
+
+
+
+
Wizard
+
+ +
+
+ +
+
+
+
+
Basic Wizard
+
+
+
+

First Step

+
First Content
+

Second Step

+
Second Content
+
+
+
+
+
+ +
+
+
+
+
wizard with validation
+
+
+
+

Account Information

+
+
+
+ + + Enter User Name! +
+
+ + + Enter Valid Password! +
+
+ + + Enter Valid Password! +
+
+
+

Profile Information

+
+
+ + + Enter First Name! +
+
+ + + Enter Last Name! +
+
+ + + Enter Valid Email! +
+
+ + + Enter Valid Age! +
+
+

Finish

+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
Verticle Steps
+
+
+

Keyboard

+
+

Try the keyboard navigation by clicking arrow left or right!

+
+

Effects

+
+

Wonderful transition effects.

+
+

Pager

+
+

The next and previous buttons help you to navigate through your content.

+
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
Online
+
+
    +
  • ... + +
    +
    John Deo
    +
    Spine Surgeon
    +
    +
  • +
  • +
    + 5 +
    ... + +
    +
    Rajesh
    +
    Director
    +
    +
  • +
  • ... + +
    +
    Jacob Ryan
    +
    Ortho Surgeon
    +
    +
  • +
  • +
    + 8 +
    ... + +
    +
    Kehn Anderson
    +
    CEO
    +
    +
  • +
  • ... + +
    +
    Sarah Smith
    +
    Anaesthetics
    +
    +
  • +
  • ... + +
    +
    Vlad Cardella
    +
    Cardiologist
    +
    +
  • +
+
+
Offline
+
+
    +
  • +
    + 4 +
    ... + +
    +
    Jennifer Maklen
    +
    Nurse
    +
    Last seen 01:20 AM
    +
    +
  • +
  • ... + +
    +
    Lina Smith
    +
    Ortho Surgeon
    +
    Last seen 11:14 PM
    +
    +
  • +
  • +
    + 9 +
    ... + +
    +
    Jeff Adam
    +
    Compounder
    +
    Last seen 3:31 PM
    +
    +
  • +
  • ... + +
    +
    Anjelina Cardella
    +
    Physiotherapist
    +
    Last seen 7:45 PM
    +
    +
  • +
+
+
+ +
+ + +
+
+
+
Layout Settings
+
+
+
+
+
Sidebar Position
+
+ +
+
+
+
Header
+
+ +
+
+ +
+
Footer
+
+ +
+
+
+
+
Account Settings
+
+
+
+
Notifications
+
+
+ +
+
+
+
+
Show Online
+
+
+ +
+
+
+
+
Status
+
+
+ +
+
+
+
+
2 Steps Verification
+
+
+ +
+
+
+
+
+
General Settings
+
+
+
+
Location
+
+
+ +
+
+
+
+
Save Histry
+
+
+ +
+
+
+
+
Auto Updates
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/errors/cli/error_404.php b/application/views/errors/cli/error_404.php new file mode 100644 index 0000000..6984b61 --- /dev/null +++ b/application/views/errors/cli/error_404.php @@ -0,0 +1,8 @@ + + +An uncaught Exception was encountered + +Type: +Message: +Filename: getFile(), "\n"; ?> +Line Number: getLine(); ?> + + + +Backtrace: +getTrace() as $error): ?> + + File: + Line: + Function: + + + + diff --git a/application/views/errors/cli/error_general.php b/application/views/errors/cli/error_general.php new file mode 100644 index 0000000..6984b61 --- /dev/null +++ b/application/views/errors/cli/error_general.php @@ -0,0 +1,8 @@ + + +A PHP Error was encountered + +Severity: +Message: +Filename: +Line Number: + + + +Backtrace: + + + File: + Line: + Function: + + + + diff --git a/application/views/errors/cli/index.html b/application/views/errors/cli/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/views/errors/cli/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/views/errors/html/error_404.php b/application/views/errors/html/error_404.php new file mode 100644 index 0000000..756ea9d --- /dev/null +++ b/application/views/errors/html/error_404.php @@ -0,0 +1,64 @@ + + + + +404 Page Not Found + + + +
+

+ +
+ + \ No newline at end of file diff --git a/application/views/errors/html/error_db.php b/application/views/errors/html/error_db.php new file mode 100644 index 0000000..f5a43f6 --- /dev/null +++ b/application/views/errors/html/error_db.php @@ -0,0 +1,64 @@ + + + + +Database Error + + + +
+

+ +
+ + \ No newline at end of file diff --git a/application/views/errors/html/error_exception.php b/application/views/errors/html/error_exception.php new file mode 100644 index 0000000..8784886 --- /dev/null +++ b/application/views/errors/html/error_exception.php @@ -0,0 +1,32 @@ + + +
+ +

An uncaught Exception was encountered

+ +

Type:

+

Message:

+

Filename: getFile(); ?>

+

Line Number: getLine(); ?>

+ + + +

Backtrace:

+ getTrace() as $error): ?> + + + +

+ File:
+ Line:
+ Function: +

+ + + + + + +
\ No newline at end of file diff --git a/application/views/errors/html/error_general.php b/application/views/errors/html/error_general.php new file mode 100644 index 0000000..fc3b2eb --- /dev/null +++ b/application/views/errors/html/error_general.php @@ -0,0 +1,64 @@ + + + + +Error + + + +
+

+ +
+ + \ No newline at end of file diff --git a/application/views/errors/html/error_php.php b/application/views/errors/html/error_php.php new file mode 100644 index 0000000..b146f9c --- /dev/null +++ b/application/views/errors/html/error_php.php @@ -0,0 +1,33 @@ + + +
+ +

A PHP Error was encountered

+ +

Severity:

+

Message:

+

Filename:

+

Line Number:

+ + + +

Backtrace:

+ + + + +

+ File:
+ Line:
+ Function: +

+ + + + + + + +
\ No newline at end of file diff --git a/application/views/errors/html/index.html b/application/views/errors/html/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/views/errors/html/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/views/errors/index.html b/application/views/errors/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/views/errors/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/views/front/agent-change-password.php b/application/views/front/agent-change-password.php new file mode 100644 index 0000000..2d5f9b7 --- /dev/null +++ b/application/views/front/agent-change-password.php @@ -0,0 +1,123 @@ +load->view('front/includes/header'); ?> +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} +?> + + + + +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Change Password

+ num_rows()>0) + { + $ud=$userdet->row(); + $id=$ud->id; + $name=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $country=$ud->country; + $password=$ud->password; + + + } + ?> +
+ + +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+load->view('front/includes/footer'); ?> + + \ No newline at end of file diff --git a/application/views/front/agent-change-profile.php b/application/views/front/agent-change-profile.php new file mode 100644 index 0000000..8a10fa3 --- /dev/null +++ b/application/views/front/agent-change-profile.php @@ -0,0 +1,103 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} +?> + + + + +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Edit Profile Picture

+ num_rows()>0) + { + $ud=$userdet->row(); + $id=$ud->id; + $name=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $profilepic=$ud->profilepic; + $country=$ud->country; + + + } + ?> + +
+
+ +
+
+
+ + +
+
+
+ +
+
+
+ + + +
+ +
+
+
+
+load->view('front/includes/footer'); ?> + + diff --git a/application/views/front/agent-document-collect.php b/application/views/front/agent-document-collect.php new file mode 100644 index 0000000..a5d26da --- /dev/null +++ b/application/views/front/agent-document-collect.php @@ -0,0 +1,168 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} + +$CI=&get_instance(); +$CI->load->model("frontend_model"); + + + + + +?> + + + + +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+ num_rows()>0) + { + $p=$quote_user->row(); + $username=$p->username; + $user_id=$p->user_id; + $policy_id=$p->policy_id; + $agency_id=$p->agency_id; + + } + ?> +
+

Document Collection of

+ +
+ + + +
+
+
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ + +load->view('front/includes/footer'); ?> + + + + + \ No newline at end of file diff --git a/application/views/front/agent-edit-profile.php b/application/views/front/agent-edit-profile.php new file mode 100644 index 0000000..1a63541 --- /dev/null +++ b/application/views/front/agent-edit-profile.php @@ -0,0 +1,305 @@ +load->view('front/includes/header'); ?> + + + + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if(isset($userdet)&& $userdet->num_rows()>0) +{ + $ud=$userdet->row(); + $id=$ud->id; + $loggedusername=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $country=$ud->country; + $profilepic=$ud->profilepic; + + +} +?> + + + +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Edit Profile

+ num_rows()>0) + { + $ag=$age->row(); + $category=$ag->category; + $introd=$ag->intro; + $experience=$ag->experience; + $location =$ag->location; + $term =$ag->term; + $benefits =$ag->benefits; + $specializations =$ag->specializations; + + $racetype =$ag->racetype; + $pincode =$ag->pincode; + $company =$ag->company; + $cmpname =$ag->cmpname; + $agent_code =$ag->agent_code; + $category_notify =$ag->category_notify; + $racetype_notify =$ag->racetype_notify; + $company_notify =$ag->company_notify; + $g=explode(" ", $experience); + $gnumber=$g[0]; + $gperiod=$g[1]; + $categoryFor=explode(",", $category); + $racetypeFor=explode(",", $racetype); + + }?> +
+ + + + + + + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+ +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+ +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+
+ +
+ + +
+
+
+ +
+ + +
+
+ +
+
+
+ + +
+
+ +
+
+ +
+
+ +
+ +
+
+

Edit Changes only once for further updates please contact your admin

+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+
+ +
+
+
+
+ +
+
+
+
+load->view('front/includes/footer'); ?> + + + \ No newline at end of file diff --git a/application/views/front/agent-order.php b/application/views/front/agent-order.php new file mode 100644 index 0000000..73e1100 --- /dev/null +++ b/application/views/front/agent-order.php @@ -0,0 +1,270 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} + +$CI=&get_instance(); +$CI->load->model("frontend_model"); + + + + + +?> + + + + +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Your Order

+
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($age_ord->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $username=$gq->name; + $policy_id=$gq->policy_id; + $agency_id=$gq->agency_id; + $cdate=$gq->cdate; + + $status=$gq->status; + + $tables="policies"; + $wheres=array("id"=>$policy_id); + $shows=("*"); + $pol=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($pol->num_rows()>0){ + $po=$pol->row(); + $policyname=$po->name; + } + + + ?> + + + + + + + + + + + + + + + +
S.NoPolicy NameUser NameDateActionResponse
+ + Pending + + Accepted + + Completed + + Canceled + +
+ +
+ +
+ +
+ Completed + + Canceled + +
+
+ +
+ +
+
+
+
+ + + +load->view('front/includes/footer'); ?> + + + \ No newline at end of file diff --git a/application/views/front/agent-profile.php b/application/views/front/agent-profile.php new file mode 100644 index 0000000..7fc8cc6 --- /dev/null +++ b/application/views/front/agent-profile.php @@ -0,0 +1,349 @@ +load->view('front/includes/header'); ?> + + + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); + + + +if(isset($userdet)&& $userdet->num_rows()>0) +{ + $ud=$userdet->row(); + $id=$ud->id; + $loggedusername=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $country=$ud->country; + $profilepic=$ud->profilepic; + + +} +?> + + + + +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+ +
+
+ + + num_rows()>0) + { + $ag=$age->row(); + $category=$ag->category; + $introd=$ag->intro; + $experience=$ag->experience; + $location =$ag->location; + $term =$ag->term; + $benefits =$ag->benefits; + $specializations =$ag->specializations; + $racetype =$ag->racetype; + $pincode =$ag->pincode; + $company =$ag->company; + $cmpname =$ag->cmpname; + + }?> +
+
+ load->view('front/includes/leftmenu'); ?> +
+ +
+

Update Profile

+ num_rows()>0) + { + $ag=$age->row(); + $category=$ag->category; + $introd=$ag->intro; + $experience=$ag->experience; + $location =$ag->location; + $term =$ag->term; + $benefits =$ag->benefits; + $specializations =$ag->specializations; + $password=$ag->password; + $racetype =$ag->racetype; + $pincode =$ag->pincode; + $company =$ag->company; + $cmpname =$ag->cmpname; + $agent_code =$ag->agent_code; + $category_notify =$ag->category_notify; + $racetype_notify =$ag->racetype_notify; + $company_notify =$ag->company_notify; + $g=explode(" ", $experience); + $gnumber=$g[0]; + $gperiod=$g[1]; + $categoryFor=explode(",", $category); + $racetypeFor=explode(",", $racetype); + + }?> + + + + + + + + + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+ +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+ +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+
+ +
+ + +
+
+
+ + +
+
+ +
+
+ +
+
+ +
+ +
+ + +
+
+ +
+ + +
+
+ +
+ +
+ + +
+
+
+
+
+
+
+ +
+
+
+ + +
+ +
+
+
+

Edit Changes only once for further updates please contact your admin

+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+
+ +
+
+ +
+ +
+
+
+ +
+ + + + + + load->view('front/includes/footer'); ?> + + + + + \ No newline at end of file diff --git a/application/views/front/agent-request.php b/application/views/front/agent-request.php new file mode 100644 index 0000000..d44b438 --- /dev/null +++ b/application/views/front/agent-request.php @@ -0,0 +1,385 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} + +$CI=&get_instance(); +$CI->load->model("frontend_model"); + + + + + +?> + + + + +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Request From User

+
+ + + + + + + + + + + + + + + + num_rows()>0) + $i=1; + { foreach($age_req->result() as $r) + { + + $qid=$r->id; + $user_id=$r->user_id; + $username=$r->name; + $cdate=$r->cdate; + $pincode=$r->pincode; + $policy_id=$r->policy_id; + $status=$r->status; + $company=$r->company; + $agency_id=$r->agency_id; + + $getquote=$CI->frontend_model->select_pincode_agentcount($pincode,$agentcount,$company); + + //echo $this->db->last_query(); + if($status==0){ $statusreq="Requested"; } + else if($status==1) { $statusreq= "Accepted"; } + else if($status==2) { $statusreq= "Completed"; } + else if($status==3) { $statusreq= "Cancelled"; } + else if($status==4) { $statusreq= "Document Collected"; } + else if($status==5) { $statusreq= "Verified"; } + else if($status==6) { $statusreq= "Policy Issued"; } + + if($primaryid!=0){ + $tables="users"; + $wheres=array("id"=>$primaryid); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $r=$agename->row(); + $al_mobile=$r->mobile; + $al_email=$r->email; + } + } + + foreach($getquote->result() as $gq){ + + $name=$gq->name; + $loggeduserid=$gq->id; + $tables="policies"; + $wheres=array("id"=>$policy_id); + $shows=("*"); + + $pokl=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if($pokl->num_rows()>0) + { + $p=$pokl->row(); + $policyname=$p->name; + $category=$p->category; + } + $tables="quote_response"; + $wheres=array("quote_id"=>$qid,"user_id"=>$user_id,"agency_id"=>$loggeduserid); + $shows=("*"); + $resp=$this->commonsql_model->selectTable($tables,$wheres,$shows); + //get completed or cancelled agent show + + $resp_det=$this->frontend_model->get_agent_det_to_show_quote($loggeduserid); + + //quote info wise -- completed agents + if($primaryid==$loggeduserid){ + if($agency_id==0){ + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S.NoUser NamePolicy NameDateStatusAction
+ num_rows()>0){ + $re=$resp->row(); + $mobile=$re->mobile; + $email=$re->email; + $message=$re->message; + $response_status=$re->status; + if($response_status!=7 && $status==0){?> +
+ +
+
+ +
+ + + + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ num_rows()>0){ + $re=$resp->row(); + $mobile=$re->mobile; + $email=$re->email; + $message=$re->message; + if($status==0){?> +
+ +
+
+ +
+ + + + + +
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+
+ + + +load->view('front/includes/footer'); ?> + + + \ No newline at end of file diff --git a/application/views/front/agent-review.php b/application/views/front/agent-review.php new file mode 100644 index 0000000..c683733 --- /dev/null +++ b/application/views/front/agent-review.php @@ -0,0 +1,112 @@ +load->view('front/includes/header'); ?> +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} + + + +?> + + + + +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Reviews From User

+
+ + + + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($rev->result() as $r) + { + $id=$r->id; + $username=$r->username; + $rating=$r->rating; + $text=$r->text; + $status=$r->status; + if($status==0){ $val="1";$mgsstatus="Not Approved"; $msg="Approve"; $colors="red"; $color="success";} + else { $val="0";$mgsstatus="Approved"; $msg="Not Approve"; $color="danger";$colors="green"; } + ?> + + + + + + + + + + + + + + +
S.NoUser NameRatingReviewStatusAction
+
+ +
+ +
+
+
+
+load->view('front/includes/footer'); ?> + \ No newline at end of file diff --git a/application/views/front/become_agent.php b/application/views/front/become_agent.php new file mode 100644 index 0000000..f4e203b --- /dev/null +++ b/application/views/front/become_agent.php @@ -0,0 +1,180 @@ + + + +
+
+
+ +
+
+ Image + +
+ +
+

Don't have an Account? Register Now.

+ +
+

Kindly fill all manditory ( * ) fields

+
+ + +
+ +
+ + +
+
+ +
+ +
+ + +
+ +
+ + +
+ + +
+
+ + + +
+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+ + +
+
+
+ +
+ +
+ +
+
+
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/application/views/front/category_compare_details.php b/application/views/front/category_compare_details.php new file mode 100644 index 0000000..d919572 --- /dev/null +++ b/application/views/front/category_compare_details.php @@ -0,0 +1,126 @@ +load->view('front/includes/header'); ?> + +
+
+
+ + + + + + + + + num_rows()>0) + { + + foreach($compared->result() as $ps) + { + $logo=$ps->logo; + $life_cover=$ps->life_cover; + $max_cover_age=$ps->max_cover_age;?> + + + + + + num_rows()>0) + { + + foreach($compared_mas->result() as $cm) + { + $cate=$this->uri->segment(2); + $CI=&get_instance(); + $CI->load->model("Frontend_model"); + $compare=$cm->compare; + $compare_name=$cm->compare_name; + + + + + + ?> + + + result() as $ps) + { + $policy=$ps->id; + + $det=$this->Frontend_model->get_compare_details($compare,$policy,$cate); + if(isset($det)&& $det->num_rows()>0) + { + $d=$det->row(); + $comparedetail=$d->comparedetail; + }else { $comparedetail="-"; } + ?> + + + + + +
Comparison Fields + +
+ +
+ Image + +
+
+ Max Limit : Yrs
+ Life Cover : +
+
+ + +
+
+
+
+
+load->view('front/includes/footer'); ?> + \ No newline at end of file diff --git a/application/views/front/category_compare_plan.php b/application/views/front/category_compare_plan.php new file mode 100644 index 0000000..e15b871 --- /dev/null +++ b/application/views/front/category_compare_plan.php @@ -0,0 +1,38 @@ + + + num_rows()>0) + { + $ps=$complan->row(); + $polid=$ps->id; + $polname=$ps->name; + $image=$ps->image; + $logo=$ps->logo; + $life_cover=$ps->life_cover; + $claimed_settlement=$ps->claimed_settlement; + $max_cover_age=$ps->max_cover_age; + $is_this_top_plan=$ps->is_this_top_plan; + } + + ?> + +
+ +
+ +
+ Image + +
+
+ Max Limit : Yrs
+ Life Cover : +
+
+
+ + + + + + \ No newline at end of file diff --git a/application/views/front/category_viewprice.php b/application/views/front/category_viewprice.php new file mode 100644 index 0000000..dead420 --- /dev/null +++ b/application/views/front/category_viewprice.php @@ -0,0 +1,874 @@ + +session->userdata('primaryid'); +$CI=&get_instance(); +$CI->load->model("Frontend_model"); +$indexcategory=$this->uri->segment(3); +?> + + + +num_rows()>0) +{ + $mobexistval="1"; +} +else +{ + $mobexistval="2"; +}?> +
+ +
+ num_rows()>0) + { + $s=$lfgetcat->row(); + $id=$s->id; + $name=$s->name; + $short_description=$s->short_description; + } else + { + $name=""; + $short_description=""; + } + ?> + +
+

+

+
+ +
+ +
+
+

Go with your details

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

Go with your details

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

Go with your details

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

Go with your details

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

Go with your details

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

Go with your details

+
+
+ + +
+
+ + + +
+ + +
+ +
+ + +
+
+
+ +
+
+
+ + + + +
+ +
+ + +
+
+ +
+
+ + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/front/category_wise_question.php b/application/views/front/category_wise_question.php new file mode 100644 index 0000000..76763f4 --- /dev/null +++ b/application/views/front/category_wise_question.php @@ -0,0 +1,381 @@ + + + + + + + + + + + diff --git a/application/views/front/includes/footer.php b/application/views/front/includes/footer.php new file mode 100644 index 0000000..3ad7d20 --- /dev/null +++ b/application/views/front/includes/footer.php @@ -0,0 +1,464 @@ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/front/includes/header.php b/application/views/front/includes/header.php new file mode 100644 index 0000000..a07e7f5 --- /dev/null +++ b/application/views/front/includes/header.php @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + Policybot + + + +1); +$show=("*"); +$result=$this->commonsql_model->selectTable($table,$where,$show); + +$primaryid=$this->session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + +$tables="users"; +$wheres=array("id"=>$primaryid,"status"=>1); +$shows=("*"); +$userres=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userres->num_rows()>0) +{ + $u=$userres->row(); + $loggedusername=$u->name; +} +?> + + + +
+ + +
+ +
+ + + + + + diff --git a/application/views/front/includes/leftmenu.php b/application/views/front/includes/leftmenu.php new file mode 100644 index 0000000..87a481c --- /dev/null +++ b/application/views/front/includes/leftmenu.php @@ -0,0 +1,37 @@ +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + +$segment=$this->uri->segment(1); + + ?> + + + + + + \ No newline at end of file diff --git a/application/views/front/includes/msg.php b/application/views/front/includes/msg.php new file mode 100644 index 0000000..6aabc50 --- /dev/null +++ b/application/views/front/includes/msg.php @@ -0,0 +1,11 @@ + session->userdata('suc')) { ?> +
+ Success ! session->userdata('suc'); echo $this->session->unset_userdata('suc'); ?> + +
+session->userdata('err')) { ?> +
+ Error ! session->userdata('err'); echo $this->session->unset_userdata('err'); ?> + +
+ \ No newline at end of file diff --git a/application/views/front/index-.php b/application/views/front/index-.php new file mode 100644 index 0000000..8d584d2 --- /dev/null +++ b/application/views/front/index-.php @@ -0,0 +1,882 @@ + + + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); +$loggedmobile=$this->session->userdata('loggedmobile'); +$loggedpincode=$this->session->userdata('loggedpincode'); +$loggeddob=$this->session->userdata('loggeddob'); +$loggedgender=$this->session->userdata('loggedgender'); +$loggedcarno=$this->session->userdata('loggedcarno'); +$loggedbikeno=$this->session->userdata('loggedbikeno'); +$loggedcompanyno=$this->session->userdata('loggedcompanyno'); +$loggedcountry=$this->session->userdata('loggedcountry'); +$loggedleavingdate=$this->session->userdata('loggedleavingdate'); +$loggedreturndate=$this->session->userdata('loggedreturndate'); +?> + +
+
+
+

Switch to Digit Insurance

+

Trusted by 2 crore Indians

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

Our Products

+ Sub-Title for the Heading Block +
+
+

Motor Insurance

+
+ +
+ +
+
+
+ +
+
+
Car
+
+
+
+
+
+
+ +
+
+
Bike
+
+
+
+
+
+
+ +
+
+
OD for Car
+
+
+
+
+
+
+ +
+
+
Rickshaw
+
+
+
+
+
+
+ +
+
+
Taxi Or Cab
+
+
+
+
+
+
+ +
+
+
Truck
+
+
+
+ + +
+
+

Health Insurance

+
+ +
+ +
+
+
+ +
+
+
Health
+
+
+
+
+
+
+ +
+
+
OPD
+
+
+
+
+
+
+ +
+
+
Super Top-Up
+
+
+
+
+
+
+ +
+
+
Arogya Sanjeevani
+
+
+
+
+
+
+ +
+
+
Port Health
+
+
+
+
+
+
+ +
+
+
Employee Help
+
+
+
+ + +
+
+

Other Insurance

+
+ +
+ +
+
+
+ +
+
+
International Travel
+
+
+
+
+
+
+ +
+
+
Flight Delay
+
+
+
+
+
+
+ +
+
+
Property
+
+
+
+
+
+
+ +
+
+
Home
+
+
+
+
+
+
+ +
+
+
Shop
+
+
+
+
+
+
+ +
+
+
Fire
+
+
+
+ + +
+
+
+
+
+

Features that you are gonna Love

+ Canvas comes with 100+ Feature oriented Shortcodes that are easy to use too. +
+ +
+
+
+
+ +
+
+

Low premium

+

Powerful Layout with Responsive functionality that can be adapted to any screen size.

+
+
+
+ +
+
+
+ +
+
+

Hassle Free Claims

+

Looks beautiful & ultra-sharp on Retina Displays with Retina Icons, Fonts & Images.

+
+
+
+ +
+
+
+ +
+
+

Easy and Quick

+

Optimized code that are completely customizable and deliver unmatched fast performance.

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

Why choose Us.

+
+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi quidem minus id omnis, nam expedita, ea fuga commodi voluptas iusto, hic autem deleniti dolores explicabo labore enim repellat earum perspiciatis.

+ +
+ +
+ +
+

Our Mission.

+
+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi quidem minus id omnis, nam expedita, ea fuga commodi voluptas iusto, hic autem deleniti dolores explicabo labore enim repellat earum perspiciatis.

+ +
+ +
+ +
+

What we Do.

+
+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi quidem minus id omnis, nam expedita, ea fuga commodi voluptas iusto, hic autem deleniti dolores explicabo labore enim repellat earum perspiciatis.

+ +
+ +
+ +
+ +
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/application/views/front/index.php b/application/views/front/index.php new file mode 100644 index 0000000..f57505b --- /dev/null +++ b/application/views/front/index.php @@ -0,0 +1,710 @@ + + + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); +$loggedmobile=$this->session->userdata('loggedmobile'); +$loggedpincode=$this->session->userdata('loggedpincode'); +$loggeddob=$this->session->userdata('loggeddob'); +$loggedgender=$this->session->userdata('loggedgender'); +$loggedcarno=$this->session->userdata('loggedcarno'); +$loggedbikeno=$this->session->userdata('loggedbikeno'); +$loggedcompanyno=$this->session->userdata('loggedcompanyno'); +$loggedcountry=$this->session->userdata('loggedcountry'); +$loggedleavingdate=$this->session->userdata('loggedleavingdate'); +$loggedreturndate=$this->session->userdata('loggedreturndate'); +?> + +
+
+
+

Switch to Digit Insurance

+

Trusted by 2 crore Indians

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

Our Products

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

Features that you are gonna Love

+ Canvas comes with 100+ Feature oriented Shortcodes that are easy to use too. +
+ +
+
+
+
+ +
+
+

Low premium

+

Powerful Layout with Responsive functionality that can be adapted to any screen size.

+
+
+
+ +
+
+
+ +
+
+

Hassle Free Claims

+

Looks beautiful & ultra-sharp on Retina Displays with Retina Icons, Fonts & Images.

+
+
+
+ +
+
+
+ +
+
+

Easy and Quick

+

Optimized code that are completely customizable and deliver unmatched fast performance.

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

Why choose Us.

+
+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi quidem minus id omnis, nam expedita, ea fuga commodi voluptas iusto, hic autem deleniti dolores explicabo labore enim repellat earum perspiciatis.

+ +
+ +
+ +
+

Our Mission.

+
+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi quidem minus id omnis, nam expedita, ea fuga commodi voluptas iusto, hic autem deleniti dolores explicabo labore enim repellat earum perspiciatis.

+ +
+ +
+ +
+

What we Do.

+
+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi quidem minus id omnis, nam expedita, ea fuga commodi voluptas iusto, hic autem deleniti dolores explicabo labore enim repellat earum perspiciatis.

+ +
+ +
+ +
+ +
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/application/views/front/policy-detail--.php b/application/views/front/policy-detail--.php new file mode 100644 index 0000000..c822fc1 --- /dev/null +++ b/application/views/front/policy-detail--.php @@ -0,0 +1,539 @@ + + + + + num_rows()>0) +{ +$s=$pol->row(); +$id=$s->id; +$name=$s->name; +$image=$s->image; +$intro=$s->intro; +$policy_period=$s->policy_period; +$guarantee=$s->guarantee; +$category=$s->category; +$amount=$s->amount; +$amount_period=$s->amount_period; +$cmpname=$s->cmpname; +$catname=$s->catname; +$benefits=$s->benefits; +$specializations=$s->specializations; +} +$primaryid=$this->session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); +//wishlist +$table="wishlist"; +$where=array("user_id"=>$primaryid,"policy_id"=>$id,"status"=>1); +$show=("*"); +$wish=$this->commonsql_model->selectTable($table,$where,$show); + $CI=&get_instance(); +$CI->load->model("Frontend_model"); ?> +
+
+
+ +
+ +
+
+

+ Powered By + +
+ +
+ + +
+ +
+ +
+ +
+

+
+ +
+ + + +
+ +
+
+ Most Popular +

Enquire Details

+
+ +
+
    + +
  • Policy Period
  • +
  • Guarantee
  • +
  • 24/7 Support
  • +
+
+ + + + + +
Please login to request for quote .
+ + + + +
+ +
+ +
+ + + +
+ +

Enquiry Form

+ +
+ + + +
+ +
+
+ +
+
+
+ +
+
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+ Your +

Favourites

+
+ +
+
    + +
  • Add this policy to favourites
  • +
  • Easy way to get policy
  • +
  • 24/7 Support
  • +
+
+ + num_rows()>0){ ?> + + + + + + + + +
Please login for add policy to your favourites.
+ + + + +
+ +
+
+
+ +
+ +
+
+

Policy Info:

+
+
+
+

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

Why should you buy ?

+
+
+
+
+

Benefits

+
+
+
    + +
  • + + +
+
+
+
+
+

Specialization:

+
+
+
    + +
  • + + +
+
+
+
+
+ +
+
+
+ + + + + +
+
+ Frontend_model->list_policy_agent_having($category); + + ?> +
+ +
+

Related Agents

+ +
+ + num_rows()>0){ + foreach($getageinfo->result() as $agin){ + $agentid=$agin->user_id; + $intro=$agin->intro; + $experience=$agin->experience; + + $racetype=$agin->racetype; + $company=$agin->company; + $agent_code=$agin->agent_code; + $agentname=$agin->agentname; + $profilepic=$agin->profilepic; + + $revw=$CI->Frontend_model->agent_review_from_user($agentid); + $agcomp=$CI->Frontend_model->agent_completed_policy($agentid); + $wrtrev=$CI->Frontend_model->write_review_permission($primaryid,$id); + if($revw->num_rows()>0) + { + $rw=$revw->row(); + $rating=$rw->rating; + $text=$rw->text; + $emptystar=5-$rating; + } + if($wrtrev->num_rows()>0) + { + $wr=$wrtrev->row(); + $review_agency_id=$wr->agency_id; + } + ?> + +
+
+
+
+ Image +
+
+
+ +

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

+
    +
  • Experience
  • +
  • num_rows();?> Completed Policies
  • + +
+ + + Write a review + + + + +
+
+ + + +
+ +
+ +
+
+
+ + +
+ uri->segment(2); ?> + +

Related Policies

+ + +
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/application/views/front/policy-detail.php b/application/views/front/policy-detail.php new file mode 100644 index 0000000..f915941 --- /dev/null +++ b/application/views/front/policy-detail.php @@ -0,0 +1,518 @@ + + + + + + num_rows()>0) +{ +$s=$pol->row(); +$id=$s->id; +$name=$s->name; +$image=$s->image; +$intro=$s->intro; +$policy_period=$s->policy_period; +$guarantee=$s->guarantee; +$category=$s->category; +$amount=$s->amount; +$amount_period=$s->amount_period; +$cmpname=$s->cmpname; +$catname=$s->catname; +$benefits=$s->benefits; +$specializations=$s->specializations; +} +$primaryid=$this->session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); +//wishlist +$table="wishlist"; +$where=array("user_id"=>$primaryid,"policy_id"=>$id,"status"=>1); +$show=("*"); +$wish=$this->commonsql_model->selectTable($table,$where,$show); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +$pincode=""; +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $pincode=$u->pincode; +} +$CI=&get_instance(); +$CI->load->model("Frontend_model"); +//session info +$loggedname=$this->session->userdata('loggedname'); +$loggedmobile=$this->session->userdata('loggedmobile'); +$loggedpincode=$this->session->userdata('loggedpincode'); +$loggeddob=$this->session->userdata('loggeddob'); +$loggedgender=$this->session->userdata('loggedgender'); +$loggedcarno=$this->session->userdata('loggedcarno'); +$loggedbikeno=$this->session->userdata('loggedbikeno'); +$loggedcompanyno=$this->session->userdata('loggedcompanyno'); +$loggedcountry=$this->session->userdata('loggedcountry'); +$loggedleavingdate=$this->session->userdata('loggedleavingdate'); +$loggedreturndate=$this->session->userdata('loggedreturndate'); + + + ?> +
+
+
+ +
+ +
+
+

+ Powered By + +
+ +
+ + +
+ +
+

+
+ + + +
+ +
+ +
+
+

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

Go with your details

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

Go with your details

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

Go with your details

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

Go with your details

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

Go with your details

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

Go with your details

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

Why should you buy ?

+
+
+
+
+

Benefits

+
+
+
    + +
  • + + +
+
+
+
+
+

Specialization:

+
+
+
    + +
  • + + +
+
+
+
+
+ +
+
+ +
+ + +
+ +
+ + + + diff --git a/application/views/front/review-popup.php b/application/views/front/review-popup.php new file mode 100644 index 0000000..8234c5e --- /dev/null +++ b/application/views/front/review-popup.php @@ -0,0 +1,56 @@ + + + + + + \ No newline at end of file diff --git a/application/views/front/send_request_agents_info.php b/application/views/front/send_request_agents_info.php new file mode 100644 index 0000000..e69de29 diff --git a/application/views/front/ua-dashboard.php b/application/views/front/ua-dashboard.php new file mode 100644 index 0000000..969e7b1 --- /dev/null +++ b/application/views/front/ua-dashboard.php @@ -0,0 +1,375 @@ +load->view('front/includes/header'); ?> +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); +$CI=&get_instance(); +$CI->load->model("frontend_model"); +//quote count +$tables="quotes"; +$wheres=array("user_id"=>$primaryid); +$shows=("*"); +$quotecount=$this->commonsql_model->selectTable($tables,$wheres,$shows); + +//order count +$tables="quotes"; +$wheres=array("user_id"=>$primaryid,'status'=>1); +$shows=("*"); +$ordercount=$this->commonsql_model->selectTable($tables,$wheres,$shows); +//complete count +$tables="quotes"; +$wheres=array("user_id"=>$primaryid,'status'=>2); +$shows=("*"); +$comcount=$this->commonsql_model->selectTable($tables,$wheres,$shows); +//cancel count +$tables="quotes"; +$wheres=array("user_id"=>$primaryid,'status'=>3); +$shows=("*"); +$cancelcount=$this->commonsql_model->selectTable($tables,$wheres,$shows); + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if(isset($userdet)&& $userdet->num_rows()>0) + { + $ud=$userdet->row(); + $loggedusername=$ud->name; + } +?> + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+ +
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+ num_rows()>0) + { + $ud=$userdet->row(); + $id=$ud->id; + $name=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $country=$ud->country; + $profilepic=$ud->profilepic; + + + } + ?> +
+ +
+
+
+
+ +
+ +
+

Present Request

+
+
+
+
+
+
+ +
+
+

Present Orders

+
+
+
+ +
+
+
+ +
+
+

Present Completion

+
+
+
+ +
+
+
+ +
+
+

Present cancellation

+
+
+
+ + +
$primaryid); + $shows=("*"); + $aquotecount=$this->commonsql_model->selectTable($tables,$wheres,$shows); + + //order count + $tables="quotes"; + $wheres=array("agency_id"=>$primaryid,'status'=>1); + $shows=("*"); + $aordercount=$this->commonsql_model->selectTable($tables,$wheres,$shows); + //complete count + $tables="quotes"; + $wheres=array("agency_id"=>$primaryid,'status'=>2); + $shows=("*"); + $acomcount=$this->commonsql_model->selectTable($tables,$wheres,$shows); + //cancel count + $tables="quotes"; + $wheres=array("agency_id"=>$primaryid,'status'=>3); + $shows=("*"); + $acancelcount=$this->commonsql_model->selectTable($tables,$wheres,$shows);?> + +
+
+
+
+ +
+ +
+

present Request

+
+
+
+
+
+
+ +
+
+

present Orders

+
+
+
+ +
+
+
+ +
+
+

present Completion

+
+
+
+ +
+
+
+ +
+
+

present cancellation

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

Recent Order Details

+
+
+ + + + + + + + + + + + + + + frontend_model->get_recent_order_details($primaryid); + if($userrequsetdet->num_rows()>0){ + $o=1; + foreach($userrequsetdet->result() as $u){ + $policy_id=$u->policy_id; + $status=$u->status; + $cdate=$u->cdate; + $policyname=$u->policyname; + $agency_id=$u->agency_id; + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if($agname->num_rows()>0){ + $a=$agname->row(); + $agent_name=$a->name;$colors="Black"; + } + } + else + { + $agent_name="Not Assigned";$colors="red"; + } + if($status=="0"){ $policystatus="Requested"; $color="#9b59b6";} + if($status=="1"){ $policystatus="Accepted"; $color="#094aab";} + if($status=="2"){ $policystatus="Completed";$color="green";} + if($status=="3"){ $policystatus="Cancelled";$color="red";} + ?> + + + + + + + + + + + +
S.NoDatePolicy NameAgent NameStatus
+
+
+
+
+

Claimed Policies

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
#Table headingTable headingTable headingTable headingTable headingTable heading
1Table cellTable cellTable cellTable cellTable cellTable cell
+
+
+
+
+

Recent Order Details

+
+
+ + + + + + + + + + + + + + + frontend_model->get_recent_order_details_agent($primaryid); + if($userrequsetdet->num_rows()>0){ + $o=1; + foreach($userrequsetdet->result() as $u){ + $policy_id=$u->policy_id; + $status=$u->status; + $cdate=$u->cdate; + $policyname=$u->policyname; + $agency_id=$u->user_id; + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agname=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if($agname->num_rows()>0){ + $a=$agname->row(); + $agent_name=$a->name;$colors="Black"; + } + } + else + { + $agent_name="Not Assigned";$colors="red"; + } + if($status=="0"){ $policystatus="Requested"; $color="#9b59b6";} + if($status=="1"){ $policystatus="Accepted"; $color="#094aab";} + if($status=="2"){ $policystatus="Completed";$color="green";} + if($status=="3"){ $policystatus="Cancelled";$color="red";} + ?> + + + + + + + + + + + +
S.NoDatePolicy NameUser NameStatus
+
+
+ +
+
+ +
+
+
+load->view('front/includes/footer'); ?> \ No newline at end of file diff --git a/application/views/front/user-change-password.php b/application/views/front/user-change-password.php new file mode 100644 index 0000000..8d60f31 --- /dev/null +++ b/application/views/front/user-change-password.php @@ -0,0 +1,123 @@ +load->view('front/includes/header'); ?> +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} +?> + + + + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Change Password

+ num_rows()>0) + { + $ud=$userdet->row(); + $id=$ud->id; + $name=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $country=$ud->country; + $password=$ud->password; + + + } + ?> +
+ + +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+load->view('front/includes/footer'); ?> + + \ No newline at end of file diff --git a/application/views/front/user-change-profile.php b/application/views/front/user-change-profile.php new file mode 100644 index 0000000..d1c4644 --- /dev/null +++ b/application/views/front/user-change-profile.php @@ -0,0 +1,103 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} +?> + + + + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Edit Profile Picture

+ num_rows()>0) + { + $ud=$userdet->row(); + $id=$ud->id; + $name=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $profilepic=$ud->profilepic; + $country=$ud->country; + + + } + ?> + +
+
+ +
+
+
+ + +
+
+
+ +
+
+
+ + + +
+ +
+
+
+
+load->view('front/includes/footer'); ?> + + diff --git a/application/views/front/user-edit-profile.php b/application/views/front/user-edit-profile.php new file mode 100644 index 0000000..fb1bd90 --- /dev/null +++ b/application/views/front/user-edit-profile.php @@ -0,0 +1,137 @@ +load->view('front/includes/header'); ?> +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} +?> + + + + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Edit Profile

+ num_rows()>0) + { + $ud=$userdet->row(); + $id=$ud->id; + $name=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $country=$ud->country; + + + } + ?> +
+ +
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+
+ +
+
+
+
+ +
+
+
+
+load->view('front/includes/footer'); ?> \ No newline at end of file diff --git a/application/views/front/user-favourites.php b/application/views/front/user-favourites.php new file mode 100644 index 0000000..1dc8c2c --- /dev/null +++ b/application/views/front/user-favourites.php @@ -0,0 +1,123 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdets=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdets->num_rows()>0) +{ + $u=$userdets->row(); + $loggedusername=$u->name; +} + +$tables="wishlist"; +$wheres=array("user_id"=>$primaryid,"status"=>1); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); + +?> + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+ +
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Favourites

+
+ num_rows()>0) + { + foreach($userdet->result() as $pd) + { + + $wid=$pd->id; + $policy_id=$pd->policy_id; + $tables="policies"; + $wheres=array("id"=>$policy_id); + $shows=("*"); + + $img=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if($img->num_rows()>0){ + $i=$img->row(); + $name=$i->name; + $policyimg=$i->image; + } + ?> +
+ +
+
+ +
+ +
+
+ + + +
+ +
+
+ +
+
+
+load->view('front/includes/footer'); ?> + + \ No newline at end of file diff --git a/application/views/front/user-order.php b/application/views/front/user-order.php new file mode 100644 index 0000000..816f174 --- /dev/null +++ b/application/views/front/user-order.php @@ -0,0 +1,275 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} + +$CI=&get_instance(); +$CI->load->model("frontend_model"); + + + + + +?> + + + + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Your Order

+
+ + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($user_ord->result() as $gq){ + + $quoteid=$gq->id; + $agency_id=$gq->agency_id; + $policyname=$gq->policyname; + $category=$gq->category; + $policy_id=$gq->policy_id; + $cdate=$gq->cdate; + $status=$gq->status; + + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agedet=$this->commonsql_model->selectTable($tables,$wheres,$shows); + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $categoryname=$ca->name; + } + if ($agedet->num_rows()>0){ + $ad=$agedet->row(); + $agentname=$ad->name; + } + + ?> + + + + + + + + + + + + + + + +
S.NoPolicy NameAgent NameDateActionResponse
+ + Cancel + + Accepted + + Completed + + Canceled + + + + Pending + + In Progress + + Completed + + Canceled + + +
+
+ +
+ +
+
+
+
+ + + +load->view('front/includes/footer'); ?> + + + \ No newline at end of file diff --git a/application/views/front/user-profile.php b/application/views/front/user-profile.php new file mode 100644 index 0000000..746c8f8 --- /dev/null +++ b/application/views/front/user-profile.php @@ -0,0 +1,185 @@ +load->view('front/includes/header'); ?> +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="quotes"; +$wheres=array("agency_id"=>$primaryid); +$shows=("*"); +$Agreq=$this->commonsql_model->selectTable($tables,$wheres,$shows); + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if(isset($userdet)&& $userdet->num_rows()>0) + { + $ud=$userdet->row(); + $loggedusername=$ud->name; + } +?> + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+ +
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+ num_rows()>0) + { + $ud=$userdet->row(); + $id=$ud->id; + $name=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $country=$ud->country; + $profilepic=$ud->profilepic; + $password=$ud->password; + + } + ?> + +
+ +
+ + Avatar + + +
+

+ Your Profile Bio +
+ +
+ +
+

Basic Info

+
+ +
: +
+
+ +
+ +
+ +
+ +
: +
+
+ +
+ +
+
+ +
: +
+
+ +
+ +
+ +
+ +
: +
+
+ +
+ +
+
+ +
: +
+
+ +
+ +
+
+

Password Updation

+ + +
+ +
: +
+
+ + +
+
+
+ +
: +
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+ +
+
+
+ +
+
+ +
+ + +
+ +
+
+
+load->view('front/includes/footer'); ?> \ No newline at end of file diff --git a/application/views/front/user-request.php b/application/views/front/user-request.php new file mode 100644 index 0000000..81da455 --- /dev/null +++ b/application/views/front/user-request.php @@ -0,0 +1,330 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} + +$CI=&get_instance(); +$CI->load->model("frontend_model"); + + + + + +?> + + + + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Your Request

+
+ + + + + + + + + + + + + + + + num_rows()>0) + + { $i=1; + foreach($user_req->result() as $gq){ + + $quoteid=$gq->id; + $user_id=$gq->user_id; + $category=$gq->category; + $cdate=$gq->cdate; + $policy_id=$gq->policy_id; + $policyname=$gq->policyname; + $status=$gq->status; + $agency_id=$gq->agency_id; + //get response given or not + $tables="quote_response"; + $wheres=array("quote_id"=>$quoteid); + $shows=("*"); + $get_respo_sts=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($get_respo_sts->num_rows()>0){ + $response_status="1";//response given + + } + else{$response_status="0"; // response notgiven + + } + + + $tables="categories"; + $wheres=array("id"=>$category); + $shows=("*"); + $categ=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($categ->num_rows()>0){ + $ca=$categ->row(); + $ategoryname=$ca->name; + } + if($agency_id!=0){ + $tables="users"; + $wheres=array("id"=>$agency_id); + $shows=("*"); + $agename=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if ($agename->num_rows()>0){ + $a=$agename->row(); + $agency_name=$a->name; + $agency_name=$a->name; + $a_color="#fd653b"; + } + } + else + { + $agency_name="Not Assigned"; $a_color="#dc3545"; + } + + ?> + + + + + + + + + + + + + + + +
S.NoPolicy NameCategoryAssigned AgentDateActionResponse
+ +
+ +
Canceled
+ +
Accepted
+ +
Process Closed
+ +
Document Collected
+ +
Waiting For Policy Issuance
+ +
Waiting For Completion
+ +
+
+ +
+ +
+ +
+ + + + + +
+ +
+ + + +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+ +
+
+
+
+ + + +load->view('front/includes/footer'); ?> + + + \ No newline at end of file diff --git a/application/views/front/user-response-view--.php b/application/views/front/user-response-view--.php new file mode 100644 index 0000000..34446ff --- /dev/null +++ b/application/views/front/user-response-view--.php @@ -0,0 +1,112 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} + +$CI=&get_instance(); +$CI->load->model("frontend_model"); + + + + + +?> + + + + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+
+

Response From Agents

+ num_rows()>0){ + foreach($user_req->result() as $urq){ + $agentname=$urq->agentname; + $quote_id=$urq->quote_id; + $user_id=$urq->user_id; + $agency_id=$urq->agency_id; + $mobile=$urq->mobile; + $email=$urq->email; + $message=$urq->message; + $status=$urq->status; + $profilepic=$urq->profilepic; + + ?> +
+
+
+ +
+ +
+

+
+
Response
+

Contact


+

Email


+

Message


+ + Accept + Not Interest + + Accepted + + Cancelled + + +
+
+ + No Response..! + + +
+
+ +
+
+
+
+ + +load->view('front/includes/footer'); ?> + \ No newline at end of file diff --git a/application/views/front/user-response-view.php b/application/views/front/user-response-view.php new file mode 100644 index 0000000..c73fc31 --- /dev/null +++ b/application/views/front/user-response-view.php @@ -0,0 +1,131 @@ +load->view('front/includes/header'); ?> + +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} + +$CI=&get_instance(); +$CI->load->model("frontend_model"); + + + + + +?> + + + + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+
+

Response From Agents

+ num_rows()>0){ + foreach($user_req->result() as $urq){ + $agentname=$urq->agentname; + $quote_id=$urq->quote_id; + $user_id=$urq->user_id; + $agency_id=$urq->agency_id; + $mobile=$urq->mobile; + $email=$urq->email; + $message=$urq->message; + $status=$urq->status; + $profilepic=$urq->profilepic; + $agency_id=$urq->agency_id; + $revw=$CI->frontend_model->agent_review_from_user($agency_id); + if($revw->num_rows()>0) + { + $rw=$revw->row(); + $rating=$rw->rating; + $text=$rw->text; + $emptystar=5-$rating; + } + else {$rating="0";$emptystar=5-$rating;} + ?> +
+
+
+ +
+ +
+

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

Message


+ + Accept + Not Interest + + Accepted + + Cancelled + + +
+
+ + No Response..! + + +
+
+ +
+
+
+
+ + +load->view('front/includes/footer'); ?> + \ No newline at end of file diff --git a/application/views/front/user-review.php b/application/views/front/user-review.php new file mode 100644 index 0000000..f646fd0 --- /dev/null +++ b/application/views/front/user-review.php @@ -0,0 +1,111 @@ +load->view('front/includes/header'); ?> +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if($userdet->num_rows()>0) +{ + $u=$userdet->row(); + $loggedusername=$u->name; +} + + + +?> + + + + +
+ +
+

User Profile

+ Hi , Welcome to policybot +
+ +
+ +
+
+
+
+
+ load->view('front/includes/leftmenu'); ?> +
+
+

Your Reviews

+
+ + + + + + + + + + + + + + + num_rows()>0) + { + $i=1; + foreach($rev->result() as $r) + { + $id=$r->id; + $username=$r->agentname; + $rating=$r->rating; + $text=$r->text; + $status=$r->status; + if($status==0){ $mgsstatus="Not Approved"; $msg="Approve"; $colors="red"; $color="success";} + else { $mgsstatus="Approved"; $msg="Not Approve"; $color="danger";$colors="green"; } + ?> + + + + + + + + + + + + + +
S.NoAgent NameRatingReviewStatus
+
+ +
+ +
+
+
+
+load->view('front/includes/footer'); ?> + \ No newline at end of file diff --git a/application/views/front/view_agent_to_user.php b/application/views/front/view_agent_to_user.php new file mode 100644 index 0000000..8d4ea90 --- /dev/null +++ b/application/views/front/view_agent_to_user.php @@ -0,0 +1,263 @@ + +uri->segment(3); +$ageid=$this->uri->segment(2); + +$primaryid=$this->session->userdata('primaryid'); +?> + + + num_rows()>0) +{ +$s=$agede->row(); +$agentid=$s->user_id; +$cmpname=$s->cmpname; +$experience=$s->experience; +$profilepic=$s->profilepic; +$intro=$s->intro; +$agentname=$s->agentname; + +$category=$s->category; + +} +$primaryid=$this->session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + $CI=&get_instance(); +$CI->load->model("Frontend_model"); ?> +
+
+
+
+
+
+

+
+
+
+
+ + +
+ +
+ Go Back + +

Agent Profile

+ +
+ + Frontend_model->agent_review_from_user($agentid); + $agcomp=$CI->Frontend_model->agent_completed_policy($agentid); + + if($revw->num_rows()>0) + { + $rw=$revw->row(); + $rating=$rw->rating; + $text=$rw->text; + $emptystar=5-$rating; + } + else {$rating="0";$emptystar=5-$rating;} + ?> + +
+
+
+
+ Image +
+
+
+ +

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

+
    +
  • Experience
  • +
  • num_rows();?> Completed Policies
  • + +
+ +
+
+ + + +
+ +
+ num_rows()>0) { ?> +

Reviews from customer

+ + +
+ + result() as $rea){ + $ratings=$rea->rating; + $text=$rea->text; + $username=$rea->username; + $cdate=$rea->cdate; + $emptystara=5-$ratings; + ?> +
+
+ + +
+ + Image + + + +
+ +
+ + + + + + + + +
+

+
+ +
+ + +
+ +
+ +
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/application/views/front/z-agent-profile.php b/application/views/front/z-agent-profile.php new file mode 100644 index 0000000..3d55dcc --- /dev/null +++ b/application/views/front/z-agent-profile.php @@ -0,0 +1,244 @@ +load->view('front/includes/header'); ?> +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); + + + +if(isset($userdet)&& $userdet->num_rows()>0) +{ + $ud=$userdet->row(); + $id=$ud->id; + $loggedusername=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $country=$ud->country; + $profilepic=$ud->profilepic; + + +} +?> + + + + +
+ +
+

Agent Profile

+ Hi , Welcome to policybot +
+ +
+ +
+ +
+
+ + + num_rows()>0) + { + $ag=$age->row(); + $category=$ag->category; + $introd=$ag->intro; + $experience=$ag->experience; + $location =$ag->location; + $term =$ag->term; + $benefits =$ag->benefits; + $specializations =$ag->specializations; + $racetype =$ag->racetype; + $pincode =$ag->pincode; + $company =$ag->company; + $cmpname =$ag->cmpname; + + }?> +
+
+ load->view('front/includes/leftmenu'); ?> +
+ +
+ + +
+ + Avatar + +
+

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

+
+ +
+
    +
  • + Address: +
  • +
  • + City: +
  • +
  • + State: +
  • +
  • + Pincode: +
  • +
  • + Company: +
  • +
+
+
+
+
+ + + Category: $ca); + $shows=("*"); + $cate=$this->commonsql_model->selectTable($tables,$wheres,$shows); + if(isset($cate)&& $cate->num_rows()>0) + { + $c=$cate->row(); + $categoryname=$c->name;} + + ?> +

Not Mentioned...!

+
+
+
+ +
+ +
+
+ + +
+ +
+
+
    + +
  • Not Mentioned...!

    + +
+
+
+ + +
+ +
+
+ +
+
    +
    +
    +
      + +
    • Not Mentioned...!

      + +
    +
    +
    + + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ + + +
+ +
+
+
+ +
+ + + + + + load->view('front/includes/footer'); ?> \ No newline at end of file diff --git a/application/views/front/z-ua-dashboard.php b/application/views/front/z-ua-dashboard.php new file mode 100644 index 0000000..9c88f1b --- /dev/null +++ b/application/views/front/z-ua-dashboard.php @@ -0,0 +1,395 @@ + +load->view('front/includes/header'); ?> +session->userdata('primaryid'); +$userrole=$this->session->userdata('userrole'); +$loggedname=$this->session->userdata('loggedname'); + + +$tables="quotes"; +$wheres=array("agency_id"=>$primaryid); +$shows=("*"); +$Agreq=$this->commonsql_model->selectTable($tables,$wheres,$shows); + +$tables="users"; +$wheres=array("id"=>$primaryid); +$shows=("*"); + +$userdet=$this->commonsql_model->selectTable($tables,$wheres,$shows); +if(isset($userdet)&& $userdet->num_rows()>0) + { + $ud=$userdet->row(); + $loggedusername=$ud->name; + } + + +?> + +
+ +
+

User Agent Dashboard

+ Hi , Welcome to policybot +
+ +
+ +
+ num_rows()>0) + { + $ud=$userdet->row(); + $id=$ud->id; + $name=$ud->name; + $email=$ud->email; + $mobile=$ud->mobile; + $pincode=$ud->pincode; + $state=$ud->state; + $city=$ud->city; + $address=$ud->address; + $country=$ud->country; + $profilepic=$ud->profilepic; + $password=$ud->password; + + + } + ?> +
+
+ + +
+ Avatar + + +

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

Request

+
+
+
+
+
+
+ +
+
+

Orders

+
+
+
+ +
+
+
+ +
+
+

Reviews

+
+
+
+ +
+
+
+ +
+
+

Favourites

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

Request

+
+
+
+
+
+
+ +
+
+

Orders

+
+
+
+ +
+
+
+ +
+
+

Reviews

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

Recent Order Details

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#Table headingTable headingTable headingTable headingTable headingTable heading
1Table cellTable cellTable cellTable cellTable cellTable cell
2Table cellTable cellTable cellTable cellTable cellTable cell
3Table cellTable cellTable cellTable cellTable cellTable cell
+
+
+ +
+
+

Claimed Policies

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#Table headingTable headingTable headingTable headingTable headingTable heading
1Table cellTable cellTable cellTable cellTable cellTable cell
2Table cellTable cellTable cellTable cellTable cellTable cell
3Table cellTable cellTable cellTable cellTable cellTable cell
+
+
+
+
+
+ +
+ + + + +
+ + load->view('front/includes/footer'); ?> + + + \ No newline at end of file diff --git a/application/views/front/zindex.html b/application/views/front/zindex.html new file mode 100644 index 0000000..62e1bc9 --- /dev/null +++ b/application/views/front/zindex.html @@ -0,0 +1,858 @@ + + +
+
+ +
+
+
+
+
+

Welcome to Canvas

+

Create just what you need for your Perfect Website. Choose from a wide range of Elements & simply put them on your own Canvas.

+
+
+
+
+
+
+
+

Beautifully Flexible

+

Looks beautiful & ultra-sharp on Retina Screen Displays. Powerful Layout with Responsive functionality that can be adapted to any screen size.

+
+
+
+ +
+
+
+
+
+
+

Great Performance

+

You'll be surprised to see the Final Results of your Creation & would crave for more.

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

Welcome to Canvas.
MultiPurpose Template.

+
+

Create a website that you are gonna be proud of. Be it Business, Portfolio, Agency, Photography, eCommerce & much more.

+
+ +
+ +
+ Chrome + iPhone +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+ Scalable on Devices. +

Responsive & Retina

+
+

Employment respond committed meaningful fight against oppression social challenges rural legal aid governance. Meaningful work, implementation, process cooperation, campaign inspire.

+
+ +
+ +
+ Smartly Coded & Maintained. +

Powerful Performance

+
+

Medecins du Monde Jane Addams reduce child mortality challenges Ford Foundation. Diversification shifting landscape advocate pathway to a better life rights international. Assessment.

+
+ +
+ +
+ Flexible & Customizable. +

Truly Multi-Purpose

+
+

Democracy inspire breakthroughs, Rosa Parks; inspiration raise awareness natural resources. Governance impact; transformative donation philanthropy, respect reproductive.

+
+ +
+ +
+
+ +
+ +
+

Even more Feature Rich

+ Philanthropy convener livelihoods, initiative end hunger gender rights local. John Lennon storytelling; advocate, altruism impact catalyst. +
+ +
+
+ +
+
+ +
+
+

Boxed & Wide Layouts

+

Stretch your Website to the Full Width or make it boxed to surprise your visitors.

+
+
+ +
+
+ +
+
+

Extensive Documentation

+

We have covered each & everything in our Docs including Videos & Screenshots.

+
+
+ +
+
+ +
+
+

Parallax Support

+

Display your Content attractively using Parallax Sections with HTML5 Videos.

+
+
+ +
+ +
+ iphone 2 +
+ +
+ +
+
+ +
+
+

HTML5 Video

+

Canvas provides support for Native HTML5 Videos that can be added to a Background.

+
+
+ +
+
+ +
+
+

Endless Possibilities

+

Complete control on each & every element that provides endless customization.

+
+
+ +
+
+ +
+
+

Light & Dark Color Schemes

+

Change your Website's Primary Scheme instantly by simply adding the dark class.

+
+
+ +
+
+ +
+ +
+ +
+
+ +
+
+ Easily Understandable & Customizable. +

Walkthrough Videos & Demos

+
+ + +

Democracy inspire breakthroughs, Rosa Parks; inspiration raise awareness natural resources. Governance impact; transformative donation philanthropy, respect reproductive.

+
+ +
+ +
+ +
+ +
K
+
Lines of Codes
+
+ +
+ +
+
KBs of HTML Files
+
+ +
+ +
+
No. of Templates
+
+ +
+ +
+
Hours of Coding
+
+ +
+ +
+ +
+
+
+
+ +
+
+

Responsive Layout

+

Powerful Layout with Responsive functionality that can be adapted to any screen size.

+
+
+
+ +
+
+
+ +
+
+

Retina Ready Graphics

+

Looks beautiful & ultra-sharp on Retina Displays with Retina Icons, Fonts & Images.

+
+
+
+ +
+
+
+ +
+
+

Powerful Performance

+

Optimized code that are completely customizable and deliver unmatched fast performance.

+
+
+
+ +
+
+
+ +
+
+

HTML5 Video

+

Canvas provides support for Native HTML5 Videos that can be added to a Full Width Background.

+
+
+
+ +
+
+
+ +
+
+

Parallax Support

+

Display your Content attractively using Parallax Sections that have unlimited customizable areas.

+
+
+
+ +
+
+
+ +
+
+

Endless Possibilities

+

Complete control on each & every element that provides endless customization possibilities.

+
+
+
+ +
+
+
+ +
+
+

Light & Dark Color Schemes

+

Change your Website's Primary Scheme instantly by simply adding the dark class to the body.

+
+
+
+ +
+
+
+ +
+
+

Boxed & Wide Layouts

+

Stretch your Website to the Full Width or make it boxed to surprise your visitors.

+
+
+
+ +
+
+
+ +
+
+

Extensive Documentation

+

We have covered each & everything in our Documentation including Videos & Screenshots.

+
+
+
+
+ +
+ +
+
+
+

Our Latest Works

+
+
+
+ +
+ + + + + + + + + + + + + + + + + +
+ + +
+ More than 100+ predefined Portfolio Grid Layouts. See More +
+
+ +
+ +
+
+ Iphone +
+ +
+
+

Optimized for Mobile & Touch Enabled Devices.

+
+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Vero quod consequuntur quibusdam, enim expedita sed quia nesciunt incidunt accusamus necessitatibus modi adipisci officia libero accusantium esse hic, obcaecati, ullam, laboriosam!

+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti vero, animi suscipit id facere officia. Aspernatur, quo, quos nisi dolorum aperiam fugiat deserunt velit rerum laudantium cum magnam.

+ + Learn more +
+
+ +
+ +
+ +
+

What Clients Say?

+
+ +
+
+
+
+
+ Customer Testimonails +
+
+

Similique fugit repellendus expedita excepturi iure perferendis provident quia eaque. Repellendus, vero numquam?

+
+ Steve Jobs + Apple Inc. +
+
+
+
+
+ Customer Testimonails +
+
+

Natus voluptatum enim quod necessitatibus quis expedita harum provident eos obcaecati id culpa corporis molestias.

+
+ Collis Ta'eed + Envato Inc. +
+
+
+
+
+ Customer Testimonails +
+
+

Incidunt deleniti blanditiis quas aperiam recusandae consequatur ullam quibusdam cum libero illo rerum!

+
+ John Doe + XYZ Inc. +
+
+
+
+
+
+ +
+ +
+
+
+

Latest from the Blog

+
+
+
+ +
+
+ +
+
+
+ Image +
+
+

Bloomberg smart cities; change-makers economic security

+
+ +
+

Prevention effect, advocate dialogue rural development lifting people up community civil society. Catalyst, grantees leverage.

+
+
+
+ +
+
+
+ Image +
+
+

Medicine new approaches communities, outcomes partnership

+
+ +
+

Cross-agency coordination clean water rural, promising development turmoil inclusive education transformative community.

+
+
+
+ +
+
+
+ Image +
+
+

Significant altruism planned giving insurmountable challenges liberal

+
+ +
+

Micro-finance; vaccines peaceful contribution citizens of change generosity. Measures design thinking accelerate progress medical initiative.

+
+
+
+ +
+
+
+ Image +
+
+

Compassion conflict resolution, progressive; tackle

+
+ +
+

Community health workers best practices, effectiveness meaningful work The Elders fairness. Our ambitions local solutions globalization.

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

Meet Our Team

+
+ +
+ +
+ +
+
+ John Doe +
+
+

John Doe

CEO
+ + + +
+
+ +
+ +
+ +
+
+ Josh Clark +
+
+

Josh Clark

Co-Founder
+ + + +
+
+ +
+ +
+ +
+
+ Mary Jane +
+
+

Mary Jane

Sales
+ + + +
+
+ +
+ +
+ +
+
+ Nix Maxwell +
+
+

Nix Maxwell

Support
+ + + +
+
+ +
+ +
+ +
+
+ +
+ + + + +
+
+
+ + \ No newline at end of file diff --git a/application/views/index.html b/application/views/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/application/views/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/application/views/index.php b/application/views/index.php new file mode 100644 index 0000000..2f6d7d2 --- /dev/null +++ b/application/views/index.php @@ -0,0 +1,243 @@ + + + + + +
+ +
+ + + + +

Negamam CPCL Dashboard + statistics, charts, recent events and reports +

+
+ + +
+ + + + num_rows()>0) + { + $resultbb=$bus->row(); + $bus_tot=$resultbb->bus_tot; + + } + if(isset($mat) && $mat->num_rows()>0) + { + $resultmm=$mat->row(); + $mat_tot=$resultmm->mat_tot; + + } + if(isset($emp) && $emp->num_rows()>0) + { + $resultem=$emp->row(); + $emp_tot=$resultem->emp_tot; + + } + if(isset($prod) && $prod->num_rows()>0) + { + $resultprod=$prod->row(); + $prod_tot=$resultprod->prod_tot; + + } + + + + + + ?> + +
+
+
Daybook details for all bussiness units
+
+
+
+ +
+
+
+ +
+

MY DAYBOOK FOR

+ + + +
+
+ +
+
+ num_rows()>0) + { + $result=$day_purchase->row(); + $pur_tot=$result->pur_tot; + + } + if(isset($day_sales) && $day_sales->num_rows()>0) + { + $results=$day_sales->row(); + $sal_tot=$results->sal_tot; + + }$exp_tots=array(); + if(isset($day_exp) && $day_exp->num_rows()>0) + { + foreach($day_exp->result() as $resulte){ + + $exp_tots[]=$resulte->voucher_amt_dr; + } + } + if(isset($day_inc) && $day_inc->num_rows()>0) + { + $resulti=$day_inc->row(); + $inc_tot=$resulti->inc_tot; + + } + if(isset($day_ass) && $day_ass->num_rows()>0) + { + $resulta=$day_ass->row(); + $ass_tot=$resulta->ass_tot; + + } + //$ass_tot=0; + $exp_tot=array_sum($exp_tots); + $left_tot=$exp_tot; + $right_tot=$inc_tot+$ass_tot; + ?> +
+
+
+
+
Purchase
+
:
+
+
+
+
Expenses
+
:
+
+
+
+ + +
+
+
+
+
Sales
+
:
+
+ +
+
+
Income
+
:
+
+
+
+
Assets
+
:
+
+
+
+
+
+
+
+
+
+
+
Total
+
:
+
+ +
+
+
+
+
+
+
+
Total
+
:
+
+ +
+
+
+
+
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/bassets/admin/css/extra_pages.css b/bassets/admin/css/extra_pages.css new file mode 100644 index 0000000..11bbed8 --- /dev/null +++ b/bassets/admin/css/extra_pages.css @@ -0,0 +1,568 @@ +/* + * Document : extra_pages.css + * Author : RedStar Theme + * Description: this style sheet for extra page like login, logout, page_404, page_500 etc.. + + [Table of contents] + + 1. BODY + 2. FORM TITLE + 3. LOGIN FORM + 4. CUSTOM CHECKBOX + 5. PAGE 404 + 6. LOCK SCREEN + */ + +* { + margin: 0px; + padding: 0px; + box-sizing: border-box; +} + +body, html { + height: 100%; +} + +/*---------------------------------------------*/ +a { + font-size: 14px; + line-height: 1.7; + color: #666666; + margin: 0px; + transition: all 0.4s; + -webkit-transition: all 0.4s; + -o-transition: all 0.4s; + -moz-transition: all 0.4s; +} + +a:focus { + outline: none !important; +} + +a:hover { + text-decoration: none; + color: #fff; +} + +/*---------------------------------------------*/ +h1,h2,h3,h4,h5,h6 { + margin: 0px; +} + +p { + font-size: 14px; + line-height: 1.7; + color: #666666; + margin: 0px; +} + +ul, li { + margin: 0px; + list-style-type: none; +} + + +/*---------------------------------------------*/ +input { + outline: none; + border: none; +} + +textarea { + outline: none; + border: none; +} + +textarea:focus, input:focus { + border-color: transparent !important; +} + +input:focus::-webkit-input-placeholder { color:transparent; } +input:focus:-moz-placeholder { color:transparent; } +input:focus::-moz-placeholder { color:transparent; } +input:focus:-ms-input-placeholder { color:transparent; } + +textarea:focus::-webkit-input-placeholder { color:transparent; } +textarea:focus:-moz-placeholder { color:transparent; } +textarea:focus::-moz-placeholder { color:transparent; } +textarea:focus:-ms-input-placeholder { color:transparent; } + +input::-webkit-input-placeholder { color: #fff;} +input:-moz-placeholder { color: #fff;} +input::-moz-placeholder { color: #fff;} +input:-ms-input-placeholder { color: #fff;} + +textarea::-webkit-input-placeholder { color: #fff;} +textarea:-moz-placeholder { color: #fff;} +textarea::-moz-placeholder { color: #fff;} +textarea:-ms-input-placeholder { color: #fff;} + +label { + margin: 0; + display: block; +} + +/*---------------------------------------------*/ +button { + outline: none !important; + border: none; + background: transparent; +} + +button:hover { + cursor: pointer; +} + +iframe { + border: none !important; +} + + +/*////////////////////////////////////////////////////////////////// +[ Utility ]*/ +.txt1 { + font-size: 13px; + color: #e5e5e5; + line-height: 1.5; +} + + +/*////////////////////////////////////////////////////////////////// +[ login ]*/ + +.limiter { + width: 100%; + margin: 0 auto; +} + +.container-login100 { + width: 100%; + min-height: 100vh; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + padding: 15px; + + background-repeat: no-repeat; + background-position: center; + background-size: cover; + position: relative; + z-index: 1; +} +.page-background{ + background-image: url('../img/bg-01.jpg'); +} +.container-login100::before { + content: ""; + display: block; + position: absolute; + z-index: -1; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: rgba(255,255,255,0.9); +} + +.wrap-login100 { + width: 500px; + border-radius: 10px; + overflow: hidden; + padding: 37px 55px 37px 55px; + background: #9152f8; + background: -webkit-linear-gradient(top, #007bff, #5992d0); + background: -o-linear-gradient(top, #007bff, #5992d0); + background: -moz-linear-gradient(top, #007bff, #5992d0); + background: linear-gradient(top, #007bff, #5992d0); +} + + +/*------------------------------------------------------------------ +[ Form ]*/ + +.login100-form { + width: 100%; +} + +.login100-form-logo { + font-size: 60px; + color: #333333; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + justify-content: center; + align-items: center; + width: 120px; + height: 120px; + border-radius: 50%; + background-color: #2f94a5; + margin: 0 auto; +} + +.login100-form-title { + font-size: 30px; + color: #fff; + line-height: 1.2; + text-align: center; + text-transform: uppercase; + + display: block; +} +.login100-form-logo img{ + width: 125px; + border-radius: 50%; + box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.2); +} +.login-logo img{ + width: 80px; + border-radius: 50%; + box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.2); +} + + +/*------------------------------------------------------------------ +[ Input ]*/ + +.wrap-input100 { + width: 100%; + position: relative; + border-bottom: 2px solid rgba(255,255,255,0.24); + margin-bottom: 30px; +} + +.input100 { + font-size: 16px; + color: #fff; + line-height: 1.2; + + display: block; + width: 100%; + height: 45px; + background: transparent; + padding: 0 5px 0 38px; +} + +/*---------------------------------------------*/ +.focus-input100 { + position: absolute; + display: block; + width: 100%; + height: 100%; + top: 0; + left: 0; + pointer-events: none; +} + +.focus-input100::before { + content: ""; + display: block; + position: absolute; + bottom: -2px; + left: 0; + width: 0; + height: 2px; + + -webkit-transition: all 0.4s; + -o-transition: all 0.4s; + -moz-transition: all 0.4s; + transition: all 0.4s; + + background: #fff; +} + +.focus-input100::after { + font-family: Material-Design-Iconic-Font; + font-size: 22px; + color: #fff; + + content: attr(data-placeholder); + display: block; + width: 100%; + position: absolute; + top: 6px; + left: 0px; + padding-left: 5px; + + -webkit-transition: all 0.4s; + -o-transition: all 0.4s; + -moz-transition: all 0.4s; + transition: all 0.4s; +} + +.input100:focus { + padding-left: 5px; +} + +.input100:focus + .focus-input100::after { + top: -22px; + font-size: 18px; +} + +.input100:focus + .focus-input100::before { + width: 100%; +} + +.has-val.input100 + .focus-input100::after { + top: -22px; + font-size: 18px; +} + +.has-val.input100 + .focus-input100::before { + width: 100%; +} + +.has-val.input100 { + padding-left: 5px; +} + + +/*================================================================== +[ Restyle Checkbox ]*/ + +.contact100-form-checkbox { + padding-left: 5px; + padding-top: 5px; + padding-bottom: 35px; +} + +.input-checkbox100 { + display: none; +} + +.label-checkbox100 { + font-size: 13px; + color: #fff; + line-height: 1.2; + + display: block; + position: relative; + padding-left: 26px; + cursor: pointer; +} + +.label-checkbox100::before { + content: "\f26b"; + font-family: Material-Design-Iconic-Font; + font-size: 13px; + color: transparent; + + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + justify-content: center; + align-items: center; + position: absolute; + width: 16px; + height: 16px; + border-radius: 2px; + background: #fff; + left: 0; + top: 50%; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -ms-transform: translateY(-50%); + -o-transform: translateY(-50%); + transform: translateY(-50%); +} + +.input-checkbox100:checked + .label-checkbox100::before { + color: #555555; +} + + +/*------------------------------------------------------------------ +[ Button ]*/ +.container-login100-form-btn { + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + flex-wrap: wrap; + justify-content: center; +} + +.login100-form-btn { + font-size: 16px; + color: #555555; + line-height: 1.2; + display: -webkit-box; + display: -webkit-flex; + display: -moz-box; + display: -ms-flexbox; + display: flex; + justify-content: center; + align-items: center; + padding: 0 20px; + min-width: 120px; + height: 50px; + border-radius: 25px; + background: #9152f8; + background: -webkit-linear-gradient(bottom, #ecedf1, #e6e1e8); + background: -o-linear-gradient(bottom, #ecedf1, #e6e1e8); + background: -moz-linear-gradient(bottom, #ecedf1, #e6e1e8); + background: linear-gradient(bottom, #ecedf1, #e6e1e8); + position: relative; + z-index: 1; + box-shadow: 0 3px 10px 0px rgba(213, 208, 214, 0.5); + -webkit-transition: all 0.4s; + -o-transition: all 0.4s; + -moz-transition: all 0.4s; + transition: all 0.4s; +} + +.login100-form-btn::before { + content: ""; + display: block; + position: absolute; + z-index: -1; + width: 100%; + height: 100%; + border-radius: 25px; + background-color: #fff; + top: 0; + left: 0; + opacity: 1; + + -webkit-transition: all 0.4s; + -o-transition: all 0.4s; + -moz-transition: all 0.4s; + transition: all 0.4s; +} + +.login100-form-btn:hover { + color: #443f3f; +} + +.login100-form-btn:hover:before { + opacity: 0; +} + + +/*------------------------------------------------------------------ +[ Responsive ]*/ + +@media (max-width: 576px) { + .wrap-login100 { + padding: 55px 15px 37px 15px; + } +} + + + +/*------------------------------------------------------------------ +[ Alert validate ]*/ + +.validate-input { + position: relative; +} + +.alert-validate::before { + content: attr(data-validate); + position: absolute; + max-width: 70%; + background-color: #fff; + border: 1px solid #c80000; + border-radius: 2px; + padding: 4px 25px 4px 10px; + top: 50%; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -ms-transform: translateY(-50%); + -o-transform: translateY(-50%); + transform: translateY(-50%); + right: 0px; + pointer-events: none; + + color: #c80000; + font-size: 13px; + line-height: 1.4; + text-align: left; + + visibility: hidden; + opacity: 0; + + -webkit-transition: opacity 0.4s; + -o-transition: opacity 0.4s; + -moz-transition: opacity 0.4s; + transition: opacity 0.4s; +} + +.alert-validate::after { + content: "\f12a"; + font-family: FontAwesome; + font-size: 16px; + color: #c80000; + + display: block; + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -ms-transform: translateY(-50%); + -o-transform: translateY(-50%); + transform: translateY(-50%); + right: 5px; +} + +.alert-validate:hover:before { + visibility: visible; + opacity: 1; +} +.p-b-34 {padding-bottom: 34px;} +.p-t-27 { + padding-top: 27px; +} +.p-b-20{ + padding-bottom: 20px; +} +.p-t-90 { + padding-top: 90px; +} +.p-t-50 { + padding-top: 50px; +} +.p-t-30 { + padding-top: 30px; +} +.form-404{ + text-align: center; +} +.content-404 { + color: #fff; + font-size: 14px; + padding: 30px; +} +.form404-title{ + font-size: 50px; + color: #fff; +} +.txt-locked{ + color: #fff; + font-size: 18px; + padding: 10px 0px; +} +.txt-small-heading { + color: #fff; + font-size: 18px; + padding: 15px 0px; +} +@media (max-width: 992px) { + .alert-validate::before { + visibility: visible; + opacity: 1; + } +} + + + diff --git a/bassets/admin/css/font-awesome.min.css b/bassets/admin/css/font-awesome.min.css new file mode 100644 index 0000000..94644af --- /dev/null +++ b/bassets/admin/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont3e6e.eot?v=4.7.0');src:url('../fonts/fontawesome-webfontd41d.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont3e6e.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont3e6e.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont3e6e.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont3e6e.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} \ No newline at end of file diff --git a/bassets/admin/css/formlayout.css b/bassets/admin/css/formlayout.css new file mode 100644 index 0000000..2503023 --- /dev/null +++ b/bassets/admin/css/formlayout.css @@ -0,0 +1,602 @@ + +/* + * Document : formlayout.css + * Author : RedStar Theme + * Description: form control related stylesheet + */ + +.form-control { + border-radius: 0; + box-shadow: none; + border-color: #d2d6de +} + +.form-control:focus { + border-color: #3c8dbc; + box-shadow: none +} + +.form-control::-moz-placeholder, .form-control:-ms-input-placeholder, + .form-control::-webkit-input-placeholder { + color: #bbb; + opacity: 1 +} + +.form-control:not(select) { + -webkit-appearance: none; + -moz-appearance: none; +} + +/***************** form group **************/ +.form-group.has-success label { + color: #00a65a +} + +.form-group.has-success .form-control, .form-group.has-success .input-group-addon + { + border-color: #00a65a; + box-shadow: none +} + +.form-group.has-success .help-block { + color: #00a65a +} + +.form-group.has-warning label { + color: #f39c12 +} + +.form-group.has-warning .form-control, .form-group.has-warning .input-group-addon + { + border-color: #f39c12; + box-shadow: none +} + +.form-group.has-warning .help-block { + color: #f39c12 +} + +.form-group.has-error label { + color: #dd4b39 +} + +.form-group.has-error .form-control, .form-group.has-error .input-group-addon + { + border-color: #dd4b39; + box-shadow: none +} + +.form-group.has-error .help-block { + color: #dd4b39 +} +.formDatePicker{ + height: 45px !important; + margin-left: 15px; + border: 1px solid #d2d6de; +} +/***************** icons **************/ +.input-icon>i { + color: #ccc; + display: block; + position: absolute; + margin: 11px 16px 4px 10px; + z-index: 3; + width: 16px; + font-size: 16px; + text-align: center; + left: 0 +} +.input-icon.right>i { + left: auto; + right: 8px; + float: right; +} +.has-success .input-icon>i { + color: #36c6d3 +} +.has-warning .input-icon>i { + color: #F1C40F +} +.has-info .input-icon>i { + color: #659be0 +} +.has-error .input-icon>i { + color: #ed6b75 +} + +.input-group .input-group-addon { + border-radius: 0; + border-color: #d2d6de; + background-color: #fff; + border: 1px solid #d2d6de; +} +.input-group-addon { + padding: 6px 12px; +} + +.btn-group-vertical .btn.btn-flat:first-of-type, .btn-group-vertical .btn.btn-flat:last-of-type + { + border-radius: 0 +} +.input-group-sm>.form-control, .input-group-sm>.input-group-addon, .input-group-sm>.input-group-btn>.btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.icheck>label { + padding-left: 0 +} + +.form-control-feedback.fa { + line-height: 34px +} + +.input-lg+.form-control-feedback.fa, .input-group-lg+.form-control-feedback.fa, + .form-group-lg .form-control+.form-control-feedback.fa { + line-height: 46px +} + +.input-sm+.form-control-feedback.fa, .input-group-sm+.form-control-feedback.fa, + .form-group-sm .form-control+.form-control-feedback.fa { + line-height: 30px +} + +/************************************************* + + advance form + +****************************************************/ + +/*************** Toggle Button ***************/ + +.switchToggle { + position: relative; + display: inline-block; + width: 60px; + height: 34px; +} + +.switchToggle input {display:none;} + +.switchToggle .slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin:0; + background-color: #ccc; + -webkit-transition: .4s; + transition: .4s; +} + +.switchToggle .slider:before { + position: absolute; + content: ""; + height: 26px; + width: 26px; + left: 4px; + bottom: 4px; + background-color: white; + -webkit-transition: .4s; + transition: .4s; +} + +.switchToggle input:checked + .red{ + background-color: #dc5754; +} + +.switchToggle input:focus + .red{ + box-shadow: 0 0 1px #dc5754; +} + +.switchToggle input:checked + .green{ + background-color: #64bd63; +} + +.switchToggle input:focus + .green{ + box-shadow: 0 0 1px #64bd63; +} + +.switchToggle input:checked + .aqua{ + background-color: #00C0EF; +} + +.switchToggle input:focus + .aqua{ + box-shadow: 0 0 1px #00C0EF; +} + +.switchToggle input:checked + .yellow{ + background-color: #F39C12; +} + +.switchToggle input:focus + .yellow{ + box-shadow: 0 0 1px #F39C12; +} + + +.switchToggle input:checked + .slider:before { + -webkit-transform: translateX(26px); + -ms-transform: translateX(26px); + transform: translateX(26px); +} + +/*************** Rounded sliders ***************/ +.switchToggle .slider.round { + border-radius: 34px; +} + +.switchToggle .slider.round:before { + border-radius: 50%; +} + + +/*************** checkbox ***************/ +.checkbox { + padding-left: 20px; +} + +.checkbox label { + display: inline-block; + position: relative; + padding-left: 5px; +} + +.checkbox label::before { + content: ""; + display: inline-block; + position: absolute; + width: 17px; + height: 17px; + left: 0; + margin-left: -20px; + margin-top: 4px; + border: 1px solid #cccccc; + background-color: #fff; + -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; + -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; + transition: border 0.15s ease-in-out, color 0.15s ease-in-out; +} + +.checkbox label::after { + display: inline-block; + position: absolute; + width: 16px; + height: 16px; + left: 0; + top: 3px; + margin-left: -20px; + padding-left: 3px; + padding-top: 1px; + font-size: 11px; + color: #555555; +} + +.checkbox input[type="checkbox"] { + opacity: 0; +} + +.checkbox input[type="checkbox"]:checked+label::after { + font-family: 'FontAwesome'; + content: "\f00c"; +} + +.checkbox input[type="checkbox"]:disabled+label { + opacity: 0.65; +} + +.checkbox input[type="checkbox"]:disabled+label::before { + background-color: #eeeeee; + color: #eeeeef; + cursor: not-allowed; +} + +.checkbox.checkbox-inline { + margin-top: 0; +} + +/********************** checkbox with backgound color ************************/ +.checkbox-aqua input[type="checkbox"]:checked+label::before { + background-color: #00C0EF; + border-color: #00C0EE; +} + +.checkbox-aqua input[type="checkbox"]:checked+label::after { + color: #fff; +} + +.checkbox-aqua input[type="checkbox"]:hover+label::before { + border: 2px solid #00C0EF; +} + +/* checkbox with icon color */ +.checkbox-icon-aqua input[type="checkbox"]:checked+label::after { + color: #00C0EF; +} + +.checkbox-icon-aqua input[type="checkbox"]:hover+label::before { + border: 1px solid #00C0EF; +} + +/* checkbox with backgound color */ +.checkbox-yellow input[type="checkbox"]:checked+label::before { + background-color: #F39C12; + border-color: #F39C11; +} + +.checkbox-yellow input[type="checkbox"]:checked+label::after { + color: #fff; +} + +.checkbox-yellow input[type="checkbox"]:hover+label::before { + border: 2px solid #F39C12; +} + +/* checkbox with icon color */ +.checkbox-icon-yellow input[type="checkbox"]:checked+label::after { + color: #F39C12; +} + +.checkbox-icon-yellow input[type="checkbox"]:hover+label::before { + border: 1px solid #F39C12; +} + +/******************** checkbox with backgound color ************************/ +.checkbox-black input[type="checkbox"]:checked+label::before { + background-color: #000000; + border-color: #000009; +} + +.checkbox-black input[type="checkbox"]:checked+label::after { + color: #fff; +} + +.checkbox-black input[type="checkbox"]:hover+label::before { + border: 2px solid #000000; +} + +/********************* checkbox with icon color ************************/ +.checkbox-icon-black input[type="checkbox"]:checked+label::after { + color: #000000; +} + +.checkbox-icon-black input[type="checkbox"]:hover+label::before { + border: 1px solid #000000; +} + +/********************* checkbox with backgound color **********************/ +.checkbox-red input[type="checkbox"]:checked+label::before { + background-color: #dc5754; + border-color: #dc5755; +} + +.checkbox-red input[type="checkbox"]:checked+label::after { + color: #fff; +} + +.checkbox-red input[type="checkbox"]:hover+label::before { + border: 2px solid #dc5754; +} + +/****************** checkbox with icon color ***************************/ +.checkbox-icon-red input[type="checkbox"]:checked+label::after { + color: #dc5754; +} + +.checkbox-icon-red input[type="checkbox"]:hover+label::before { + border: 1px solid #dc5754; +} + +/*************** Radio button ***************/ + +.radio { + padding-left: 20px; +} + +.radio label { + display: inline-block; + position: relative; + padding-left: 5px; +} + +.radio label::before { + content: ""; + display: inline-block; + position: absolute; + width: 17px; + height: 17px; + left: 0; + margin-left: -20px; + margin-top: 4px; + border: 1px solid #cccccc; + border-radius: 50%; + background-color: #fff; + -webkit-transition: border 0.15s ease-in-out; + -o-transition: border 0.15s ease-in-out; + transition: border 0.15s ease-in-out; +} + +.radio label::after { + display: inline-block; + position: absolute; + content: " "; + width: 11px; + height: 11px; + left: 3px; + top: 7px; + margin-left: -20px; + border-radius: 50%; + background-color: #555555; + -webkit-transform: scale(0, 0); + -ms-transform: scale(0, 0); + -o-transform: scale(0, 0); + transform: scale(0, 0); + -webkit-transition: -webkit-transform 0.1s + cubic-bezier(0.8, -0.33, 0.2, 1.33); + -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); + transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); +} + +.radio input[type="radio"] { + opacity: 0; +} + +.radio input[type="radio"]:checked+label::after { + -webkit-transform: scale(1, 1); + -ms-transform: scale(1, 1); + -o-transform: scale(1, 1); + transform: scale(1, 1); +} + +.radio input[type="radio"]:disabled+label { + opacity: 0.65; +} + +.radio input[type="radio"]:disabled+label::before { + cursor: not-allowed; +} + +.radio.radio-inline { + margin-top: 0; +} + +.radio-black input[type="radio"]+label::after { + background-color: #000000; +} + +.radio-black input[type="radio"]:checked+label::before { + border-color: #000000; +} + +.radio-black input[type="radio"]:checked+label::after { + background-color: #000000; +} + +.radio-yellow input[type="radio"]+label::after { + background-color: #F39C12; +} + +.radio-yellow input[type="radio"]:checked+label::before { + border-color: #F39C12; +} + +.radio-yellow input[type="radio"]:checked+label::after { + background-color: #F39C12; +} + +.radio-red input[type="radio"]+label::after { + background-color: #dc5754; +} + +.radio-red input[type="radio"]:checked+label::before { + border-color: #dc5754; +} + +.radio-red input[type="radio"]:checked+label::after { + background-color: #dc5754; +} + +.radio-aqua input[type="radio"]+label::after { + background-color: #00C0EF; +} + +.radio-aqua input[type="radio"]:checked+label::before { + border-color: #00C0EF; +} + +.radio-aqua input[type="radio"]:checked+label::after { + background-color: #00C0EF; +} + + +.radioicon-group +{ + margin-top: 10px; +} +.radioicon label{ + font-weight:normal; + font-size: 14px; + color: black; + margin: 0px; + height:25px; +} + +.radioicon span{ + font-size: 19px; + height:25px; + width:20px; + padding-top: 5px; +} +/* Hidding the radiobuttons & checkboxes */ +.radioicon input[type="radio"]{ + display: none; +} +/* Hidding the "check" status of inputs */ +.radioicon input[type="radio"] + label .fa-circle { +display: block; +color:#cccccc; +} + +/* Styling the "check" status */ +.radioicon-aqua input[type="radio"]:checked + label .fa-circle { +display: block; +color: #00C0EF; +} + +.radioicon-red input[type="radio"]:checked + label .fa-circle { +display: block; +color: #dc5754; +} + +.radioicon-yellow input[type="radio"]:checked + label .fa-circle { +display: block; +color: #F39C12; +} + +.radioicon-black input[type="radio"]:checked + label .fa-circle { +display: block; +color: #000000; +} + + +/* Spinner control */ + +.input-group-btn-vertical { + position: relative; + white-space: nowrap; + width: 2%; + vertical-align: middle; + display: table-cell; +} + +.input-group-btn-vertical > .btn { + display: block; + float: none; + width: 30px; + padding: 8px; + margin-left: -1px; + position: relative; + border-radius: 0; +} + +.input-group-btn-vertical > .btn:first-child { + border-top-right-radius: 0px; +} + +.input-group-btn-vertical > .btn:last-child { + margin-top: -8px; + border-bottom-right-radius: 0px; +} + +.input-group-btn-vertical i { + position: absolute; + top: 0; + left: 10px; +} +#colorinput2 .input-group-addon{ + padding: 3px 10px !important; +} \ No newline at end of file diff --git a/bassets/admin/css/images/arrow-down.html b/bassets/admin/css/images/arrow-down.html new file mode 100644 index 0000000..84cd037 --- /dev/null +++ b/bassets/admin/css/images/arrow-down.html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /templates/admin/redstar/source/light/css/images/arrow-down.png was not found on this server.

+

Additionally, a 404 Not Found +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/bassets/admin/css/inbox.min.css b/bassets/admin/css/inbox.min.css new file mode 100644 index 0000000..8ff1ba2 --- /dev/null +++ b/bassets/admin/css/inbox.min.css @@ -0,0 +1,654 @@ +/* + * Document : inbox.min.css + * Author : RedStar Theme + * Description: Email inbox stylesheet + */ + +.inbox .pagination-control,.inbox th.text-right { + text-align: right +} + +.inbox { + margin-bottom: 20px +} + +.inbox .compose-btn { + padding: 8px 14px +} + +.inbox .inbox-content { + min-height: 400px +} + +.inbox .inbox-nav { + margin: 30px 0; + padding: 0; + list-style: none +} + +.inbox .inbox-nav>li { + padding: 0; + margin: 0 +} + +.inbox .inbox-nav>li>a { + text-decoration: none !important; + display: block; + padding: 10px 16px; + border-left: 4px solid transparent +} + +.inbox .inbox-nav>li>a:hover { + background: #eee; +} +.inbox .inbox-nav>li>a .badge { + float: right; + margin-top: 1px +} + +.inbox .inbox-nav>li.active>a { + border-left: 4px solid #ed6b75 +} + +.inbox .inbox-nav>li.divider { + padding: 0; + margin: 4px 16px; + border-top: 1px solid #eef1f5 +} + +.inbox .inbox-contacts { + margin: 0 0 30px; + padding: 0; + list-style: none +} + +.inbox .inbox-contacts>li { + padding: 0; + margin: 0 +} + +.inbox .inbox-contacts>li.divider { + padding: 0; + margin: 4px 16px; + border-top: 1px solid #eef1f5 +} + +.inbox .inbox-contacts>li>a { + position: relative; + display: block; + padding: 8px 16px; + color: #3f444a +} + +.inbox .inbox-contacts>li>a:hover { + background: #f1f4f7; + text-decoration: none +} + +.inbox .inbox-contacts>li>a .contact-name { + display: inline-block; + padding-left: 5px +} + +.inbox .inbox-contacts>li>a .contact-pic { + width: 30px; + height: 30px; + border-radius: 50% !important +} + +.inbox .inbox-contacts>li>a .contact-status { + position: absolute; + width: 10px; + height: 10px; + border-radius: 50% !important; + left: 38px; + top: 30px +} + +.inbox .input-actions .btn { + margin-left: 10px +} + +.inbox .inbox-view-info { + color: #666; + padding: 5px 0; + border-top: solid 1px #eee; + border-bottom: solid 1px #eee +} + +.inbox .inbox-view-info .inbox-author { + border-radius: 50% !important; + margin-right: 10px +} + +.inbox .inbox-view-info .inbox-info-btn .btn-group { + float: right; + margin-top: 5px +} + +.inbox .inbox-body,.inbox .inbox-sidebar { + + border: 1px solid #e7ecf1; + border-radius: 4px; + margin-top: 14px; +} +.btn-prev-next { + margin-right: 10px; +} + +.page-container-bg-solid .inbox .inbox-body,.page-container-bg-solid .inbox .inbox-sidebar + { + background: #fff; + border: 0 +} + +.inbox .inbox { + margin-bottom: 0 +} + +.inbox .tab-content { + overflow: inherit +} + +.inbox .inbox-loading { + display: none; + font-size: 22px; + font-weight: 300 +} + +.inbox .inbox-header { + overflow: visible; + padding-top: 13px; +} + +.inbox .inbox-header h1 { + margin: 0 0 20px; + color: #666 +} + +.inbox .pagination-control .pagination-info { + display: inline-block; + padding-right: 10px; + font-size: 14px; + line-height: 14px +} + +.inbox tr { + color: #4a4848; + font-size: 15px; + border-bottom: 1px solid #e8e8e8; +} + +.inbox tr label { + display: inline-block +} + +.inbox tr.unread td { + font-weight: 600; + vertical-align: middle; +} + +.inbox td i.icon-paper-clip { + top: 2px; + color: #d8e0e5; + font-size: 17px; + position: relative +} +.btn-group>a>i { + color: #333333; +} + +.inbox tr i.icon-star,.inbox tr i.icon-trash { + cursor: pointer +} + +.inbox tr i.icon-star { + color: #eceef0 +} +label.checkbox-custom.check-success { + margin-bottom: 0px; + display: table; +} + +.inbox tr i.icon-star:hover,.inbox tr i.inbox-started { + color: #f36a5a +} + +.inbox .table td,.inbox .table th { + border: none; + vertical-align: middle; +} + +.inbox .table th { + background: #eef4f7; + border-bottom: solid 5px #fff +} + +.inbox th label.inbox-select-all { + color: #828f97; + font-size: 13px; + padding: 1px 4px 0 +} + +.inbox td.text-right { + width: 100px; + text-align: right +} + +.inbox td.inbox-small-cells { + width: 10px +} + +.inbox .table-hover tbody tr:hover>td,.inbox .table-hover tbody tr:hover>th,.inbox .table-striped tbody>tr:nth-child(odd)>td,.inbox .table-striped tbody>tr:nth-child(odd)>th + { + background: #f8fbfd; + cursor: pointer +} + +.inbox .table-hover tbody tr:hover>td,.inbox .table-hover tbody tr:hover>th + { + background: #eef4f7 +} + +.inbox .inbox-drafts { + padding: 8px 0; + text-align: center; + border-top: solid 1px #eee; + border-bottom: solid 1px #eee +} + +.inbox-view-header { + margin-bottom: 20px +} + +.inbox-view-header h1 { + color: #666; + font-size: 22px; + line-height: 24px; + margin-bottom: 0 !important +} + +.inbox-view-header h1 a { + top: -2px; + color: #fff; + cursor: pointer; + font-size: 13px; + padding: 2px 7px; + line-height: 16px; + position: relative; + background: #b0bcc4; + display: inline-block +} + +.inbox-view-header h1 a:hover { + background: #aab5bc; + text-decoration: none +} + +.inbox-view-header i.icon-print { + color: #94a4ab; + cursor: pointer; + font-size: 14px; + display: inline-block; + padding: 6px 8px !important; + background: #edf1f4 !important +} + +.inbox-view-header i.icon-print:hover { + background: #e7ebef !important +} + +.inbox-view-info strong { + color: #666; + margin: 0 10px 0 5px +} + +.inbox-view { + color: #666; + padding: 10px 0 0 +} + +.inbox-view a { + color: #169ce9 +} + +.inbox-attached { + line-height: 16px +} + +.inbox-attached a { + margin: 0 2px +} + +.inbox-attached img { + height: auto; + max-width: 250px; + margin-bottom: 5px +} + +.inbox-attached span { + margin-right: 3px +} + +.inbox-attached strong { + color: #555; + display: block; + font-size: 13px +} + +.inbox-attached { + margin-bottom: 25px +} + +.inbox-attached .mg-bottom-15 { + margin-bottom: 15px +} + +.inbox-compose { + margin-top: 1px; + border: 1px solid #eee +} + +.inbox-compose-btn { + padding: 12px; + background: #f0f6fa +} + +.inbox-compose-attachment { + padding: 8px +} + +.inbox-compose-attachment .btn { + padding: 4px 10px +} + +.inbox-compose .inbox-form-group { + margin-bottom: 0; + position: relative; + border-bottom: solid 1px #eee +} + +.inbox-compose .controls { + margin-left: 85px +} + +.inbox-compose .inbox-form-group>label { + width: 80px; + float: left; + color: #979797; + text-align: right +} + +.inbox-compose .controls>input { + border: none !important +} + +.inbox-compose .controls-to { + padding-right: 55px +} + +.inbox-compose .controls-bcc,.inbox-compose .controls-cc { + padding-right: 20px +} + +.inbox-compose .inbox-form-group a.close { + top: 13px; + right: 10px; + position: absolute +} + +.inbox-compose .mail-to .inbox-cc-bcc { + display: inline-block; + top: 7px; + right: 10px; + color: #979797; + font-size: 14px; + cursor: pointer; + position: absolute +} + +.inbox-compose .mail-to .inbox-bcc { + margin-left: 5px +} + +.inbox-compose .mail-to inbox-bcc:hover,.inbox-compose .mail-to inbox-cc:hover + { + color: #777 +} + +.inbox-compose .wysihtml5 { + padding: 0 !important; + margin: 0 !important; + border: 0 !important +} + +.inbox-compose .wysihtml5-sandbox { + padding: 0 !important; + margin: 5px 0 0 !important; + display: block !important; + border: 0 !important; + width: 100% !important; + border-left: none; + border-right: none +} + +.inbox-compose .wysihtml5-toolbar { + border: 0; + border-bottom: 1px solid #eee +} + +.inbox-compose .wysihtml5-toolbar>li { + height: 34px; + margin-right: 0; + margin-bottom: 0 +} + +.inbox-compose .wysihtml5-toolbar>li>a,.inbox-compose .wysihtml5-toolbar>li>div>a + { + background: #fff !important; + border-color: #fbfbfb!important +} + +.inbox-compose .wysihtml5-toolbar>li>a:hover,.inbox-compose .wysihtml5-toolbar>li>div>a:hover + { + background: #f1f1f1 !important; + border-color: #f1f1f2 !important; + border-radius: 0 +} + +.inbox-compose .wysihtml5-toolbar .dropdown.open .dropdown-toggle,ul.wysihtml5-toolbar a.btn.wysihtml5-command-active + { + background: #eee !important +} +.mail-option { + padding: 0px 0px 20px 20px; +} +.label.mail-counter-style { + padding: 2px 6px 4px !important; + font-size: 10px; +} +.label.mail-label { + padding: 3px 6px !important; + font-size: 11px; +} +.table-inbox .avatar img, .table-inbox .avatar spanimg { + width: 30px; + height: 30px; +} +.table-inbox .avatar img, .table-inbox .avatar span { + width: 30px; + height: 30px; + line-height: 30px; + display: inline-block; +} +.table-inbox .avatar span { + /* background: #929292; */ + text-align: center; + color: #fff; +} +.inbox-sidebar { + background: #F2F0F5; +} +.inbox .inbox-nav>li>a { + color: #333333; +} +.inbox-sidebar { + background: #E8EAED; +} +.nav-stacked.inbox-divider li { + display: block; +} +.nav-stacked.inbox-divider { + display: block; +} +.nav-pills>li>h4 { + text-align: center; + background: #ddd; + height: 39px; + padding: 10px; +} +ul.labels-info li a { + color: #6a6a6a; + border-radius: 0; + border-right: 2px solid #f5f5f5; + display: block; +} +.nav>li>a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav.nav-pills.nav-stacked.labels-info p { + margin-bottom: 0; + padding: 0 22px; + color: #9d9f9e; + font-size: 11px; + margin-top: 0px; +} +p.date { + text-align: right; + padding-right: 20px; +} +.mail-heading { + padding: 10px 0px 0px 0px; +} +.view-mail{ + padding: 20px; +} +.mail-sender { + border-bottom: 1px solid #EFF2F7; + padding: 20px; +} +.attachment-mail { + padding: 20px; +} +.attachment-mail>ul { + list-style-type: none; +} +.btn-group .btn { + text-transform: initial; +} + + .mail-box-info .mail-list { + margin-top: 30px; +} + +.mail-list { + overflow-x: hidden; + overflow-y: auto; + background: #ffffff; +} +.view-message a { + color: black; + text-decoration: none; +} +.compose-mail { + width: 100%; + display: inline-block; + position: relative; + padding: 20px; +} +.compose-mail .form-group { + border: 1px solid #eaebee; + display: inline-block; + width: 100%; + margin-bottom: 0; +} +.compose-mail .form-group label { + line-height: 34px; + width: 70px; + float: left; + padding-left: 10px; + margin-bottom: 0; + background: #eaebee; + margin-right: 10px; +} +.compose-mail input, .compose-mail input:focus { + border: none; + padding: 0; + width: calc(92% - 70px); + float: left; +} +.compose-mail .compose-options { + color: #979797; + cursor: pointer; + display: inline-block; + font-size: 14px; + position: absolute; + right: 30px; + top: 30px; +} +.compose-options a { + color: #5C6E8A; +} +.compose-editor { + padding-top: 50px; +} +.btn-sm { + margin-right: 8px; +} +.mail-option .todo-check input[type="checkbox"] { + margin-top: 10px; +} +.btn { + padding: 8px 25px 7px; +} +.btn-group.group-padding { + padding-left: 40px; +} +.bg-info{ + color: #fff; + background-color: #6bd3f3; +} + +.bg-success{ + color: #fff; + background-color: #53d192; +} + +.bg-warning{ + color: #fff; + background-color: #ffd200; +} + +.bg-primary{ + color: #fff; + background-color: #9c78cd; +} + + +.bg-danger{ + color: #fff; + background-color: #e55957; +} + +.bg-dark{ + color: #fff; + background-color: #2b2b2c; +} +i.fa.fa-angle-down.downcolor { + color: white; +} +.media-left, .media>.pull-left { + padding-right: 10px; +} \ No newline at end of file diff --git a/bassets/admin/css/material_style.css b/bassets/admin/css/material_style.css new file mode 100644 index 0000000..fb33b04 --- /dev/null +++ b/bassets/admin/css/material_style.css @@ -0,0 +1,147 @@ +/* + * Document : material_style.css + * Author : RedStar Theme + * Description: custom style for material components + */ + +.badges .ml-card-holder .demo-badge-3[data-badge]:after { + background-color: #9c27b0; +} + +.mdl-badge .demo-badge-3[data-badge]:after{ + background-color: #9c27b0; +} +.mdl-cell.mdl-cell--3-col.mdl-cell--4-col-tablet { + padding: 15px 10px 15px 20px; +} +.mdl-cell.mdl-cell--3-col.mdl-cell--4-col-tablet:hover { + background: rgba(0,0,0,.05); + -webkit-transform: scale(1.05); + transform: scale(1.05); +} + .menuBackground { + background: white; + height: 148px; + width: 100%; +} + +.menuBar { + box-sizing: border-box; + background: #0080c0; + color: white; + width: 100%; + height: 64px; + padding: 16px; +} + +.wrapper { + box-sizing: border-box; + position: absolute; + right: 16px; +} + +.mdl-tabs__tab { + text-decoration: none !important; +} +.mdl-textfield__label:after{ + bottom: 13px !important; +} + +.ml-table-striped>tbody>tr:nth-of-type(even) { + background-color: #f9f9f9; +} +.mdl-data-table thead { + background: #FAFAFA; +} +.mdl-data-table{ + width: 100% !important; +} +.ml-table-bordered>tbody>tr>td, .ml-table-bordered>thead>tr>td { + border: 1px solid #F0F0F0; +} +/* .mdl-grid{ + background: #d3d3d3; +} +.mdl-cell{ + height: 100px; + background: grey; + color: white; + padding: 5px; +}*/ + +.mdl-gridcell{ + background: #bdbdbd; + padding: 30px 0; + text-align: center; + color: #424242; + font-weight: bold; + margin: 8px; +} +.mdl-foo{ + background:black; + padding: 5px; +} +.txt-width{ + width: 100% !important; + max-width: 500px !important; +} +.full-width{ + width: 100% !important; +} +.select-width{ + width: 100% !important; + max-width: 300px !important; +} +.getmdl-select .mdl-icon-toggle__label { + float: right; + margin-top: -30px; + color: rgba(0,0,0,0.4); +} +.mdl-button--fab:focus { + outline: none !important; +} +.mdl-button--icon:focus { + outline: none !important; +} +.mdl-textfield__label { + color: #999 !important; + font-size: 13px !important; +} +.mdl-textfield__input{ + color: #999 !important; + font-size: 13px !important; +} +.tab-left-side{ + justify-content: flex-start !important; +} +.tab-right-side{ + justify-content: flex-end !important; +} +.page-header.navbar .page-logo{ + line-height: 1.7 !important; +} +.txt-full-width { + width: 100% !important; +} +/* .mdl-button .material-icons{ + color : gray; +} */ +.menuBar .mdl-button .material-icons { + color: #ffffff;; +} +.mdl-js-button { + right: 10px; +} +.mdl-menu__item{ + font-size: 12px; +} +.mdl-menu__item .material-icons{ + padding-right: 10px; + vertical-align: middle; +} +.mdl-cell { + float: left; +} +#headerSettingButton { + color: #ffffff; +} \ No newline at end of file diff --git a/bassets/admin/css/plugins.min.css b/bassets/admin/css/plugins.min.css new file mode 100644 index 0000000..027dee0 --- /dev/null +++ b/bassets/admin/css/plugins.min.css @@ -0,0 +1,1464 @@ +@charset "UTF-8"; +/************************************************************** + 3RD PARTY PLUGIN CUSTOMIZATION +**********************************************************************************************/ + +/********************************** + Bootstrap DatePicker +***********************************/ +.datepicker .active, +.datepicker .active:hover, +.datepicker .selected, +.datepicker .today { + background-image: none !important; + filter: none !important +} +.datepaginator a { + font-family: Roboto,sans-serif; + font-size: 13px; + font-weight: 300 +} + +.datepicker table td, +.datepicker table th, +.datetimepicker table td, +.datetimepicker table th { + font-family: Roboto,sans-serif; +} + +#dp-calendar { + right: 4px !important +} + +.datepaginator .fa-angle-right:before { + content: "" +} + +.datepaginator .fa-angle-left:before, +.datepicker .fa-angle-left:before { + content: "" +} + +.datepicker.dropdown-menu { + padding: 5px; + border: 1px solid #efefef !important; + border-radius: 5px !important; + right: auto; +} +.datepicker th.switch, +.datetimepicker th.switch, +.datetimepicker th.today { + width: 145px; + background: #007bff; + color: #fff; +} +.datepicker thead tr:first-child th:hover { + background: #4b8df8; +} +.datetimepicker thead tr:first-child th:hover, .datetimepicker tfoot th:hover { + background: #4b8df8; +} +.datepicker .selected { + background-color: #909090 !important +} + +.datepicker .active { + background-color: #4b8df8 !important +} + +.datepicker .active:hover { + background-color: #2678FC !important +} + +.datepicker .input-daterange input { + text-align: left +} + +.datepicker table td { + color: #000; + font-weight: 300 !important +} + +.datepicker table th { + color: #333; + font-weight: 400 !important +} + +.datepicker .fa-angle-right:before, +.daterangepicker .fa-angle-right:before { + content: "" +} + +/*********************************** +Bootstrap Daterangepicker +************************************/ + +.daterangepicker { + margin-top: 4px +} + +.daterangepicker .input-mini { + width: 100% !important; + outline: 0 !important +} + +.daterangepicker td { + text-shadow: none +} + +.daterangepicker td.active { + background-color: #4b8df8; + background-image: none; + filter: none +} + +.datetimepicker .active, +.datetimepicker .active:hover { + filter: none !important; + background-image: none !important +} + +.daterangepicker th { + font-weight: 400; + font-size: 14px +} + +.daterangepicker .ranges input[type=text] { + width: 70px !important; + font-size: 11px; + vertical-align: middle +} + +.daterangepicker .ranges label { + font-weight: 300; + display: block +} + +.daterangepicker .ranges { + width: 170px +} + +.daterangepicker .ranges ul>li.active { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px +} + +.daterangepicker .ranges .btn { + margin-top: 10px +} + +.daterangepicker .ranges li { + color: #333 +} + +.daterangepicker .ranges li.active, +.daterangepicker .ranges li:hover { + background: #4b8df8 !important; + border: 1px solid #4b8df7 !important; + color: #fff +} + +.daterangepicker .range_inputs input { + margin-bottom: 0 !important +} + +.daterangepicker .fa-angle-left:before, +.datetimepicker .fa-angle-left:before { + content: "" +} + +/*********************************** +Bootstrap Datetimepicker +************************************/ + +.datetimepicker table td { + color: #000; + font-weight: 300 !important; + padding: 7px; + text-align: center; +} + +.datetimepicker table th { + font-weight: 400 !important +} + +.datetimepicker .active { + background-color: #4b8df8 !important +} +.datetimepicker table td:hover { + cursor: pointer; +} +.input-append.date .add-on i, .input-prepend.date .add-on i{ + display: inline-block; +} +.datetimepicker .active:hover { + background-color: #2678FC !important +} + +.datetimepicker .fa-angle-right:before { + content: "" +} + +/* change z-index when opened in modal */ +.modal-open .colorpicker, +.modal-open .datepicker, +.modal-open .daterangepicker { + z-index: 10055 !important +} +/*********************************** +Bootstrap Colorpicker +************************************/ +.colorpicker.dropdown-menu, +.daterangepicker.dropdown-menu, +.datetimepicker.dropdown-menu { + padding: 5px +} + +.input-group.color .input-group-btn i { + position: absolute; + display: block; + cursor: pointer; + width: 20px; + height: 20px; + right: 6px +} + +.modal-open .datetimepicker { + z-index: 10055 +} + +.editable-input table, +.editable-input table td, +.editable-input table th, +.editable-input table tr { + border: 0 !important +} + +.editable-input .combodate select { + margin-bottom: 5px +} + +.fileinput { + margin-bottom: 0 +} + +.fileinput .close { + float: none +} + +.fileinput .input-group { + white-space: nowrap; + overflow: hidden +} + +/*********************************** +Bootstrap Modal +***********************************/ + +.modal { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px +} + +.modal-open.page-overflow .modal-scrollable, +.modal-open.page-overflow .page-container, +.modal-open.page-overflow .page-container .navbar-fixed-bottom, +.modal-open.page-overflow .page-container .navbar-fixed-top { + overflow-y: auto !important +} + +.modal-scrollable { + overflow: hidden !important; + z-index: 10051; + overflow-y: scroll !important +} + +.modal-backdrop { + position: fixed; + bottom: 0 +} + +.modal { + border-radius: 2px; + border: 0 !important +} + +.modal .modal-body { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + border: 0 +} + +.modal .modal-title { + font-weight: 400 +} + +.modal .modal-footer { + border: 0 !important +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: .2; + filter: alpha(opacity=20) +} + + +/*********************************** +Bootstrap Select +***********************************/ + +.bootstrap-select .btn { + border-color: #c2cad8 +} + +.has-error .bootstrap-select .btn { + border-color: #fbe1e3 +} + +.has-success .bootstrap-select .btn { + border-color: #abe7ed +} + +.has-warning .bootstrap-select .btn { + border-color: #f9e491 +} + +.bootstrap-select.open .btn, +.bootstrap-select.open.dropup .btn { + border-color: #93a1bb +} + +.bootstrap-select .btn:focus { + outline: 0 !important; + outline-offset: 0 +} + +.bootstrap-select.btn-group .dropdown-menu { + margin-top: 1px +} + +.bootstrap-select.btn-group .dropdown-menu>li>dt>.text { + font-weight: 600; + font-family: Roboto,sans-serif; + font-size: 14px +} + +.bootstrap-select.btn-group .dropdown-menu .text-muted { + color: #999 !important +} + +.bootstrap-select .caret { + border: 0; + width: auto; + height: auto; + margin-top: -10px !important +} + +.bootstrap-select .caret:before { + content: "\f107"; + display: inline-block; + border: 0; + font-family: FontAwesome; + font-style: normal; + font-weight: 400 +} + +.bootstrap-select .selected i { + color: #aaa +} + +.bootstrap-select .dropdown-menu { + z-index: 9999 !important +} + +/******************************************** +Bootstrap Switch +********************************************/ + +.bootstrap-switch { + border-color: #c2cad8 +} + +.bootstrap-switch.bootstrap-switch-focused { + box-shadow: none; + border-color: #c2cad8 +} + +/******************************************** +Color variants +*********************************************/ +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary, +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary { + color: #fff; + background: #337ab7 +} + +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info, +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info { + color: #fff; + background: #659be0 +} + +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success, +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success { + color: #fff; + background: #36c6d3 +} + +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning, +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning { + color: #fff; + background: #F1C40F +} + +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger, +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger { + color: #fff; + background: #ed6b75 +} + +.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default, +.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default { + color: #444; + background: #e8eaef +} + +.bootstrap-timepicker-widget table td a { + padding: 4px 0 +} + +.bootstrap-timepicker-widget input, +.bootstrap-timepicker-widget input:focus { + outline: 0 !important; + border: 0 +} + +.modal-open .bootstrap-timepicker-widget { + z-index: 10055 !important +} + +.bootstrap-timepicker-widget.timepicker-orient-bottom:after, +.bootstrap-timepicker-widget.timepicker-orient-bottom:before { + top: auto +} + +.toast { + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important; + background-color: #030303 +} + +.tabbable-tabdrop .nav-pills, +.tabbable-tabdrop .nav-tabs { + position: relative +} + +.tabbable-tabdrop .nav-pills .caret, +.tabbable-tabdrop .nav-tabs .caret { + display: none +} + +.tabbable-tabdrop .nav-pills .tabdrop .dropdown-toggle i, +.tabbable-tabdrop .nav-tabs .tabdrop .dropdown-toggle i { + font-size: 14px +} + +.CSSAnimationChart a, +.mapChart a { + color: #bbb !important; + font-size: 12px !important +} + +.tabbable-tabdrop .dropdown-menu:after { + right: 10px; + left: auto +} + +.tabbable-tabdrop .dropdown-menu:before { + right: 9px; + left: auto +} + +.wysihtml5-sandbox { + width: 100% !important +} + +.wysihtml5-toolbar li { + margin: 0; + height: 29px +} + +.wysihtml5-toolbar li .dropdown-menu { + margin-top: 5px +} + +.has-error .wysihtml5-sandbox { + border: 1px solid #fbe1e3 !important +} + +.has-success .wysihtml5-sandbox { + border: 1px solid #abe7ed !important +} + +.has-warning .wysihtml5-sandbox { + border: 1px solid #f9e491 !important +} + +.note-editor { + border: 1px solid #c2cad8; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px +} + +.note-editor .note-toolbar { + border-bottom: 1px solid #c2cad8; + -webkit-border-radius: 2px 2px 0 0; + -moz-border-radius: 2px 2px 0 0; + -ms-border-radius: 2px 2px 0 0; + -o-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0 +} + +.note-editor .note-statusbar { + -webkit-border-radius: 0 0 2px 2px; + -moz-border-radius: 0 0 2px 2px; + -ms-border-radius: 0 0 2px 2px; + -o-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px +} + +.note-editor .note-statusbar .note-resizebar { + border-top: 1px solid #c2cad8 +} + +.note-editor.note-frame.fullscreen { + z-index: 10050; + width: 100% !important +} + +.note-editor .dropdown-menu:before { + left: 9px; + right: auto +} + +.note-editor .dropdown-menu:after { + left: 10px; + right: auto +} + +.note-link-dialog .checkbox { + margin-left: 20px +} + +.has-error .note-editor { + border: 1px solid #fbe1e3 !important +} + +.has-success .note-editor { + border: 1px solid #abe7ed !important +} + +.has-warning .note-editor { + border: 1px solid #f9e491 !important +} + +.gtreetable .dropdown-menu { + margin-top: 0 +} + +.gtreetable .dropdown-menu:after, +.gtreetable .dropdown-menu:before { + display: none !important +} + +.gtreetable .node-action .form-control { + position: relative; + top: 2px; + display: inline-block +} + +.gtreetable .node-icon-ce, +.gtreetable .node-icon-handle, +.gtreetable .node-icon-selected, +.gtreetable .node-icon-type { + opacity: .6; + filter: alpha(opacity=60) +} + +.bootstrap-tagsinput .tag [data-role=remove] { + box-shadow: none; + font-family: Roboto,sans-serif; +} + +.bootstrap-tagsinput .tag [data-role=remove]:after { + font-family: Roboto,sans-serif; +} + +.bootstrap-tagsinput .tag [data-role=remove]:hover { + text-decoration: none; + box-shadow: none +} + +.rt-bootstrap-tables .rt-btm-transform .bars { + height: auto +} + +.CSSAnimationChart, +.mapChart { + width: 100%; + height: 500px +} + +.fixed-table-toolbar .columns label { + margin: 10px; + padding: 0 0 0 30px +} + +.fixed-table-header th.bs-checkbox { + outline: 0 +} + +.fixed-table-header th.bs-checkbox .th-inner { + overflow: visible +} + +.fixed-table-header th.bs-checkbox .th-inner .rt-chkbox { + right: -5px +} + +.bootbox .bootbox-close-button { + margin-top: 0 !important +} + +.amcharts-graph-g2 .amcharts-graph-stroke { + -webkit-animation: am-moving-dashes 1s linear infinite; + animation: am-moving-dashes 1s linear infinite +} + +@ -webkit-keyframes am-moving-dashes { + 100% { + stroke-dashoffset: -31px + } +} + +@ keyframes am-moving-dashes { + 100% { + stroke-dashoffset: -31px + } +} + +.lastBullet { + -webkit-animation: am-pulsating 1s ease-out infinite; + animation: am-pulsating 1s ease-out infinite +} + +@ -webkit-keyframes am-pulsating { + 0% { + stroke-opacity: 1; + stroke-width: 0 + } + 100% { + stroke-opacity: 0; + stroke-width: 50px + } +} + +@ keyframes am-pulsating { + 0% { + stroke-opacity: 1; + stroke-width: 0 + } + 100% { + stroke-opacity: 0; + stroke-width: 50px + } +} + +.amcharts-graph-column-front { + -webkit-transition: all .3s .3s ease-out; + transition: all .3s .3s ease-out +} + +.amcharts-graph-column-front:hover { + fill: #496375; + stroke: #496375; + -webkit-transition: all .3s ease-out; + transition: all .3s ease-out +} + +.amcharts-graph-g3 { + stroke-linejoin: round; + stroke-linecap: round; + stroke-dasharray: 500%; + stroke-dasharray: 0\9; + stroke-dashoffset: 0\9; + -webkit-animation: am-draw 40s; + animation: am-draw 40s +} + +@ -webkit-keyframes am-draw { + 0% { + stroke-dashoffset: 500% + } + 100% { + stroke-dashoffset: 0 + } +} + +@ keyframes am-draw { + 0% { + stroke-dashoffset: 500% + } + 100% { + stroke-dashoffset: 0 + } +} +/*-------------------------------------------------- + [Animated Pie Chart] +----------------------------------------------------*/ +.animated-pie-chart, +.columnLine { + width: 100%; + height: 350px; + font-size: 11px +} + +.amcharts-graph-graph2 .amcharts-graph-stroke { + stroke-dasharray: 4px 5px; + stroke-linejoin: round; + stroke-linecap: round; + -webkit-animation: am-moving-dashes 1s linear infinite; + animation: am-moving-dashes 1s linear infinite +} + +@ -webkit-keyframes am-moving-dashes { + 100% { + stroke-dashoffset: -28px + } +} + +@ keyframes am-moving-dashes { + 100% { + stroke-dashoffset: -28px + } +} + +.cke { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px +} + +.cke .cke-top { + -webkit-border-radius: 2px 2px 0 0; + -moz-border-radius: 2px 2px 0 0; + -ms-border-radius: 2px 2px 0 0; + -o-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0 +} + +.cke .cke-bottom { + -webkit-border-radius: 0 0 2px 2px; + -moz-border-radius: 0 0 2px 2px; + -ms-border-radius: 0 0 2px 2px; + -o-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px +} + +.cke_bottom, +.cke_dialog, +.cke_dialog_footer, +.cke_dialog_title, +.cke_inner, +.cke_reset, +.cke_top { + background-image: none !important; + filter: none; + border-top: 0; + border-bottom: 0; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important; + text-shadow: none +} + +.cke_dialog_tab, +.cke_dialog_ui_button, +.cke_dialog_ui_input_text { + filter: none; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + background-image: none !important +} + +.cke_dialog_tab, +.cke_dialog_ui_button { + box-shadow: none !important; + text-shadow: none !important +} + +.cke_dialog_tab:hover, +.cke_dialog_ui_button:hover { + text-decoration: none; + text-shadow: none +} + +.cke_dialog_ui_input_text { + box-shadow: none !important +} + +.cke_button, +.cke_combo_button, +.cke_toolbar, +.cke_toolgroup { + background-image: none !important; + filter: none !important; + border: 0; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important +} + +.cke_button, +.cke_combo_button, +.cke_hc.cke_panel_listItem a, +.cke_panel_grouptitle { + background-image: none !important; + filter: none; + text-shadow: none +} + +.cke_button:hover, +.cke_combo_button:hover { + background-color: #ddd +} + +.cke_toolbar_break { + background-image: none !important; + filter: none !important; + border: 0; + box-shadow: none !important; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + -ms-box-shadow: none !important; + -o-box-shadow: none !important +} + +.has-error .cke { + border: 1px solid #fbe1e3 !important +} + +.has-success .cke { + border: 1px solid #abe7ed !important +} + +.has-warning .cke { + border: 1px solid #f9e491 !important +} + +.modal-open .clockface { + z-index: 10055 !important +} + +.clockface .cell .inner.active, +.clockface .cell .outer.active { + background-color: #4b8df8 !important; + background-image: none; + filter: none +} + +.table-checkable tr>td:first-child, +.table-checkable tr>th:first-child { + text-align: center; + max-width: 50px; + min-width: 40px; + padding-left: 0; + padding-right: 0 +} + +table.dataTable thead td, +table.dataTable thead th { + border-bottom: 2px solid #e7ecf1; + outline: 0 !important +} + +table.dataTable.no-footer { + border-bottom-color: #e7ecf1 +} + +.dataTables_extended_wrapper.DTS .dataTables_scrollBody, +.dataTables_extended_wrapper.DTS .dataTables_scrollHead { + border-bottom: 0 !important +} + +table.dataTable tr.heading>th { + background-color: #fbfcfd +} + +table.dataTable td.sorting_1, +table.dataTable td.sorting_2, +table.dataTable td.sorting_3, +table.dataTable th.sorting_1, +table.dataTable th.sorting_2, +table.dataTable th.sorting_3 { + background: #fbfcfd !important +} + +.paging_bootstrap_extended { + margin: 5px 0 0 !important; + padding: 0 !important; + float: none !important; + font-size: 13px +} + +.dataTables_extended_wrapper { + margin-top: 10px +} + +.dataTables_extended_wrapper .seperator { + padding: 0 2px +} + +.dataTables_extended_wrapper .table.dataTable { + margin: 20px 0 !important +} + +.dataTables_extended_wrapper div.dataTables_info, +.dataTables_extended_wrapper div.dataTables_length, +.dataTables_extended_wrapper div.dataTables_paginate { + display: inline-block; + float: none !important; + padding: 0 !important; + margin: 0 !important; + position: static !important +} + +.dataTables_extended_wrapper .table-group-actions>span { + font-size: 13px +} + +.dataTables_extended_wrapper.DTS .paging_bootstrap_extended { + display: inline-block +} + +.dataTables_extended_wrapper.DTS .dataTables_info { + display: inline-block; + padding-top: 8px !important +} + +.dataTables_extended_wrapper.DTS .dataTables_info .seperator { + display: none +} + +.dataTables_extended_wrapper.DTS .dataTables_scrollHead .dataTables_scrollHeadInner .table.dataTable { + margin-bottom: 0 !important +} + +.dataTables_extended_wrapper.DTS .dataTables_scrollBody .table.dataTable { + margin: 0 !important +} + +.dataTables_extended_wrapper div.dataTables_length label { + margin: 0 !important; + padding: 0 !important; + font-size: 13px; + float: none !important; + display: inline-block !important +} + +.table-container .table-actions-wrapper { + display: none +} + +.dataTables_scroll { + margin-bottom: 10px +} + +.dataTables_scrollHead { + border-bottom: 2px solid #e7ecf1 !important +} + +.dataTables_scrollHead thead th { + border-bottom: 0 !important +} + +.dataTables_scrollBody { + border-bottom: 1px solid #e7ecf1 !important +} + +.table-both-scroll .dataTables_scrollBody { + border-bottom: 0 !important +} + +.dataTables_wrapper .dataTables_processing { + width: 200px; + display: inline-block; + padding: 7px; + left: 50%; + margin-left: -100px; + margin-top: 10px; + text-align: center; + color: #3f444a; + border: 1px solid #e7ecf1; + background: #eef1f5; + vertical-align: middle; + -webkit-box-shadow: 0 1px 8px rgba(0, 0, 0, .1); + -moz-box-shadow: 0 1px 8px rgba(0, 0, 0, .1); + box-shadow: 0 1px 8px rgba(0, 0, 0, .1) +} + +.dt-button-background { + display: none !important +} +td.details-control { + background: url('../img/details_open.png') no-repeat center center; + cursor: pointer; +} +tr.shown td.details-control { + background: url('../img/details_close.png') no-repeat center center; +} +div.dt-button-collection { + border: 1px solid #eee; + background: #fff; + box-shadow: 5px 5px rgba(102, 102, 102, .1); + padding: 0 +} + +div.dt-button-collection>a.dt-button { + background: 0 0; + padding: 8px 16px; + font-weight: 300; + margin: 1px; + box-shadow: none !important; + border: 0 !important +} + +div.dt-button-collection>a.dt-button>span { + font-size: 14px; + color: #333 +} + +div.dt-button-collection>a.dt-button.active { + background: #f6f6f6 !important; + box-shadow: none !important; + border: 0 !important +} + +div.dt-button-collection>a.dt-button.active>span { + color: #333 +} + +a.dt-button, +button.dt-button, +div.dt-button { + background-image: none !important; + padding: 6px 12px !important +} + +a.dt-button:last-child, +button.dt-button:last-child, +div.dt-button:last-child { + margin-right: 0 +} + +.dataTables_wrapper .dt-buttons { + float: left +} +.buttons-copy { + background-color: #666 !important; + box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), 0 13px 24px -11px #666; + color: #fff !important; + border-radius: 30px !important; + border: 0px !important; + height: 30px; + width: 60px; } + +.buttons-excel { + background-color: #59bf70 !important; + box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), 0 13px 24px -11px #59bf70; + color: #fff !important; + border-radius: 30px !important; + border: 0px !important; + height: 30px; + width: 60px; } + +.buttons-csv { + background-color: #2ab9d0 !important; + box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), 0 13px 24px -11px #2ab9d0; + color: #fff !important; + border-radius: 30px !important; + border: 0px !important; + height: 30px; + width: 60px; } + +.buttons-pdf { + background-color: #e91e63 !important; + box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), 0 13px 24px -11px #e91e63; + color: #fff !important; + border-radius: 30px !important; + border: 0px !important; + height: 30px; + width: 60px; } + .buttons-print { + background-color: #6563ef !important; + box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.2), 0 13px 24px -11px #6563ef; + color: #fff !important; + border-radius: 30px !important; + border: 0px !important; + height: 30px; + width: 60px; } +.dataTable .row-details.row-details-close { + background: url(../img/datatable-row-openclose.html) no-repeat +} + +.dataTable .row-details.row-details-open { + background: url(../img/datatable-row-openclose.html) 0 -23px no-repeat +} + +.dataTable td .popover-content .btn-group { + position: static !important +} +.table .btn-group .btn { + margin-left: 0; + margin-right: -1px +} +.dropzone { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0 +} +.dropzone-file-area { + border: 2px dashed #028AF4; + background: #fff; + padding: 20px; + margin: 0 auto; + text-align: center +} +.dz-hidden-input { + left: 0 +} +.fancybox-overlay { + z-index: 100000 +} +.fancybox-opened { + z-index: 100001 +} +.spinner-buttons.btn-group-vertical .btn { + text-align: center; + margin: 0; + height: 17px; + width: 22px; + padding-left: 6px; + padding-right: 6px; + padding-top: 0 +} +.page-style-rounded .spinner-buttons.btn-group-vertical .btn.spinner-up { + border-radius: 0; + border-top-right-radius: 2px !important +} +.page-style-rounded .spinner-buttons.btn-group-vertical .btn.spinner-down { + border-radius: 0 0 2px +} + +/*********************************************** +Fullcalendar +***********************************************/ + +.external-event { + display: inline-block; + cursor: move; + margin-bottom: 5px; + margin-left: 5px +} +.fc-scroller { + overflow-y: auto; + overflow-x: hidden +} +.fc-month-view .fc-scroller { + height: auto !important +} + +/********************************************** +Google Maps +**********************************************/ + +.gmaps { + height: 300px; + width: 100% +} +.gmaps img { + max-width: none +} +#gmap_static div { + background-repeat: no-repeat; + background-position: 50% 50%; + display: block; + height: 300px +} +#gmap_routes_instructions { + margin-top: 10px; + margin-bottom: 0 +} + +/*** +Dashboard Charts(new in v1.2.1) +***/ + +.blueimp-gallery .next, +.blueimp-gallery .prev { + border-radius: 23px !important +} +.jquery-notific8-message { + font-size: 13px +} +[class*=jquery-notific8], +[class*=jquery-notific8]:after, +[class*=jquery-notific8]:before { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box +} +.left .jquery-notific8-close-sticky span, +.right .jquery-notific8-close-sticky span { + font-size: 10px +} +.jquery-notific8-heading { + font-weight: 300; + font-size: 16px +} +.scroller { + padding: 0 12px 0 0; + margin: 0; + overflow: hidden +} + +/*** +jQuery Sparkline +***/ + +.jqstooltip { + width: auto !important; + height: auto !important +} +.slider { + border: 0; + padding: 0; + display: block; + margin: 12px 5px; + min-height: 11px +} +.ui-slider-vertical { + width: 11px +} +.ui-slider-horizontal .ui-slider-handle { + top: -3px +} +.ui-slider-vertical .ui-slider-handle { + left: -3px +} +.ui-slider-handle, +.ui-slider-vertical { + filter: none !important; + background-image: none !important +} + +/************************************* + MAPS +*****************************************/ + +.jqvmap-zoomin, +.jqvmap-zoomout { + height: 16px; + width: 16px; + background-color: #666 +} +.vmaps { + position: relative; + overflow: hidden; + height: 300px +} +/************************************* + MORRIS CHART +*****************************************/ +.morris-hover.morris-default-style .morris-hover-row-label { + text-align: left; + font-weight: 400; + font-size: 15px; + color: #7D8C9D; + font-family: Roboto,sans-serif; +} +.morris-hover.morris-default-style .morris-hover-point { + text-align: left; + font-size: 14px; + font-weight: 400 +} +.morris-hover.morris-default-style .morris-hover-point, +.select2-container--bootstrap .select2-results__group, +.select2-container--bootstrap .select2-selection { + font-family: Roboto,sans-serif; +} + +.form-recaptcha-img { + margin-bottom: 10px; + clear: both; + border: 1px solid #e5e5e5; + padding: 5px +} +iframe[src="about:blank"] { + display: none +} + +/*********************************** + Select2 +***********************************/ + +.select2-container--bootstrap .select2-search--dropdown .select2-search__field, +.select2-container--bootstrap .select2-selection, +.select2-container--bootstrap.select2-container--focus .select2-selection, +.select2-container--bootstrap.select2-container--open .select2-selection { + -webkit-box-shadow: none; + box-shadow: none +} +.select2-container--bootstrap .select2-selection--multiple .select2-selection__choice__remove { + cursor: pointer; + display: inline-block; + font-weight: 700; + margin-right: 3px +} +.select2-container--bootstrap .select2-results__group { + display: block; + font-size: 12px; + white-space: nowrap; + font-weight: 600 +} +.modal-open .select2-dropdown { + z-index: 10060 +} +.modal-open .select2-close-mask { + z-index: 10055 +} +.modal-open .select2-container--bootstrap .select2-selection--multiple .select2-search--inline .select2-search__field { + width: auto !important +} +.select2-result-repository { + padding-top: 4px; + padding-bottom: 3px +} +.select2-result-repository__avatar { + float: left; + width: 60px; + margin-right: 10px +} +.select2-result-repository__avatar img { + width: 100%; + height: auto; + border-radius: 2px +} +.select2-result-repository__meta { + margin-left: 70px +} +.select2-result-repository__title { + color: #000; + font-weight: 700; + word-wrap: break-word; + line-height: 1.1; + margin-bottom: 4px +} +.select2-result-repository__forks, +.select2-result-repository__stargazers { + margin-right: 1em +} +.select2-result-repository__forks, +.select2-result-repository__stargazers, +.select2-result-repository__watchers { + display: inline-block; + color: #aaa; + font-size: 11px +} +.select2-result-repository__description { + font-size: 13px; + color: #777; + margin-top: 4px +} +.select2-results__option--highlighted .select2-result-repository__title { + color: #fff +} +.select2-results__option--highlighted .select2-result-repository__description, +.select2-results__option--highlighted .select2-result-repository__forks, +.select2-results__option--highlighted .select2-result-repository__stargazers, +.select2-results__option--highlighted .select2-result-repository__watchers { + color: #c1d7e9 +} +.select2-selection__choice { + background-color: #eee !important; + border: 1px solid #eee !important +} +.select2-selection__choice .select2-selection__choice__remove { + font-weight: 400 !important +} +/*********************************** + iCheck +***********************************/ + +.icheck-list>label { + display: block; + margin-bottom: 8px +} +.icheck-list>label:last-child { + margin-bottom: 0 +} +.form-horizontal .icheck-inline { + margin-top: 8px +} +.icheck-inline>label { + margin-left: 15px +} +.icheck-inline>label:first-child { + margin-left: 0 +} +div[class*=icheckbox_], +div[class*=iradio_] { + margin-right: 5px; + top: -1px !important +} +.ui-select-match-close { + margin-top: 5px !important; + margin-left: 5px !important +} +.minicolors-swatch { + border: 0 +} +pre[class*=language-] { + padding: 10px; + background: 0 0 !important; + border: 1px solid #f1f4f7 !important; + box-shadow: none !important; + margin: 0 +} +pre[class*=language-] code { + background: 0 0 !important; + box-shadow: none !important; + border: 0 !important +} +/*********************************** + Color Picker +***********************************/ +.colorpicker.dropdown-menu, .daterangepicker.dropdown-menu, .datetimepicker.dropdown-menu { + padding: 5px; + right: auto!important; +} \ No newline at end of file diff --git a/bassets/admin/css/responsive.css b/bassets/admin/css/responsive.css new file mode 100644 index 0000000..bd4335a --- /dev/null +++ b/bassets/admin/css/responsive.css @@ -0,0 +1,1203 @@ +@charset "ISO-8859-1"; +/* + * Document : responsive.css + * Author : RedStar Theme + * Description: A common stylesheet for responsive layout + */ + + +/* MEDIA QUERIES */ + + +@media (max-width:768px) { + .dropzone-file-area { + width: auto + } + .hidden-phone { + display: none; + } +} + +@media (max-width:480px) { + .inbox-compose .inbox-form-group>label { + margin-top: 7px + } + .dataTables_extended_wrapper div.dataTables_info, + .dataTables_extended_wrapper div.dataTables_length, + .dataTables_extended_wrapper div.dataTables_paginate { + display: block; + margin-bottom: 10px !important + } + .dataTables_extended_wrapper .seperator { + display: none !important + } +} + +@media (max-width:991px) { + .profile-sidebar { + float: none; + width: 100% !important; + margin: 0; + } + .profile-content { + overflow: visible; + } + .form .form-bordered .form-group>div { + border-left: 0 + } + .form .form-bordered .form-group .control-label { + padding-top: 10px + } + .form .form-bordered .form-actions { + padding-left: 15px!important; + padding-right: 15px!important + } + .page-header.navbar .menu-toggler.responsive-toggler { + display: block; + } + .navbar-custom{ + display: none; + } +} + +@media (max-width:1024px) { + .hidden-1024 { + display: none + } +} + +@media (max-width:480px) { + .hidden-480 { + display: none + } +} + +@media (max-width:320px) { + .hidden-320 { + display: none + } +} + +@media (max-width:767px) { + .list-separated>div { + margin-bottom: 20px + } + .navbar-nav .open .dropdown-menu { + position: absolute; + float: left; + width: auto; + margin-top: 0; + background-color: #fff; + border: 1px solid #efefef; + box-shadow: 5px 5px rgba(102, 102, 102, .1) + } + .navbar-nav .open .dropdown-menu>li>a { + padding: 6px 0 6px 13px; + color: #333 + } + .navbar-nav .open .dropdown-menu>li>a:active, + .navbar-nav .open .dropdown-menu>li>a:hover { + background-color: #eee + } + .form .form-actions .btn-set, + .form-actions .btn-set { + margin-bottom: 3px; + margin-top: 3px; + float: left!important + } + .text-stat { + margin-top: 20px + } + .table-advance tr>td.highlight:first-child a { + margin-left: 8px + } +} + +@media only screen and (min-width:768px) { + .sl-iconsdemo .item-box { + width: 33.333% + } + .cd-timeline-content h2 { + font-size: 18px; + } + .cd-timeline-content p { + font-size: 13px; + } + .cd-timeline-content .cd-read-more, + .cd-timeline-content .cd-date { + font-size: 14px; + } + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } + .navbar-left { + float: left!important; + } +} + +@media (min-width:992px) { + .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu { + box-shadow: 5px 5px rgba(44, 53, 66, .2); + } + .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu.sidebar-search-wrapper, + .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu.sidebar-toggler-wrapper { + box-shadow: none; + } + .sidemenu.sidemenu-closed>li:hover { + box-shadow: 5px 5px rgba(44, 53, 66, .2); + background-color:#1d262b; + color: white; + } + .sidemenu.sidemenu-closed>li:hover.sidebar-search-wrapper, + .sidemenu.sidemenu-closed>li:hover.sidebar-toggler-wrapper { + box-shadow: none; + } + .sidemenu.sidemenu-closed>li:hover>.sub-menu { + box-shadow: 5px 5px rgba(44, 53, 66, .2); + } + .sidemenu.sidemenu-closed>li:hover>.sub-menu.sidebar-search-wrapper, + .sidemenu.sidemenu-closed>li:hover>.sub-menu.sidebar-toggler-wrapper { + box-shadow: none; + } + .sidemenu-container-fixed:not(.page-footer-fixed) .page-content { + border-bottom: 0; + } + .sidemenu-container-fixed:not(.page-footer-fixed) .page-footer { + background-color: #fff; + } + .sidemenu-container-fixed:not(.page-footer-fixed) .page-footer .page-footer-inner { + color: #333; + } + .page-boxed { + background-color: #303a47!important; + } + .page-boxed .page-container { + background-color: #1C262F; + border-left: 1px solid #3d4957; + border-bottom: 1px solid #3d4957; + } + .page-boxed.sidemenu-container-reversed .page-container { + border-left: 0; + border-right: 1px solid #3d4957; + } + .page-boxed.sidemenu-container-fixed .page-container { + border-left: 0; + border-bottom: 0; + } + .page-boxed.sidemenu-container-reversed.sidemenu-container-fixed .page-container { + border-left: 0; + border-right: 0; + border-bottom: 0; + } + .page-boxed.sidemenu-container-fixed .sidemenu-container { + border-left: 1px solid #3d4957; + } + .page-boxed.sidemenu-container-reversed.sidemenu-container-fixed .sidemenu-container { + border-right: 1px solid #3d4957; + border-left: 0; + } + .page-boxed.sidemenu-container-fixed.page-footer-fixed .page-footer { + background-color: #303a47!important; + } + .page-boxed.sidemenu-container-fixed.page-footer-fixed .page-footer .page-footer-inner { + color: #98a6ba; + } + .sidemenu-hover-submenu li:hover a>.arrow { + border-right: 8px solid #ffffff; + } + .sidemenu-container-reversed .sidemenu-hover-submenu li:hover a>.arrow { + border-left: 8px solid #323c4b; + } + .sidemenu-hover-submenu li:hover>.sub-menu { + background: #323c4b; + } +} + +@media (max-width:991px) { + .sidemenu-container { + background-color: #28303b; + } + .sidemenu-container .sidemenu>li.open>a, + .sidemenu-container .sidemenu>li:hover>a { + background: #2e3744; + } + .sidemenu-container .sidemenu>li:last-child>a { + border-bottom: 0!important; + } + .quick-setting-main{ + display: none; + } + .white-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow, + .dark-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow, + .cyan-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow, + .indigo-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow, + .blue-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow, + .green-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow, + .red-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow{ + border-right: none !important; + } +} + +@media (max-width:480px) { + .page-header.navbar .top-menu { + background-color: #1C262F; + } + .page-header-fixed-mobile .page-header.navbar .top-menu { + background-color: #2b3643; + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-toggle {} + .page-header-fixed-mobile .page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-toggle { + background: 0 0; + } +} + +@media (max-width:768px) { + .input-large { + width: 250px!important + } + .input-xlarge { + width: 300px!important + } + .input-lg { + width: 250px!important + } + .input-xlg { + width: 300px!important + } + .modal-full.modal-dialog { + width: auto + } +} + +@media (min-width:768px) { + .page-header.navbar .search-form.search-form-expanded { + width: 200px + } + .page-header.navbar .search-form.search-form-expanded .input-group .form-control { + text-indent: 0 + } + .page-header.navbar .search-form.search-form-expanded .input-group .form-control:hover { + cursor: text + } + .page-header.navbar .search-form.search-form-expanded .input-group .input-group-btn .btn.submit { + margin-left: 0 + } + .navbar-nav>li { + float: left; + } +} + +@media (min-width:992px) and (max-width:1200px) { + .page-boxed .page-header.navbar .top-menu .navbar-nav>li.dropdown-language .dropdown-toggle .langname, + .page-boxed .page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-toggle .username.username-hide-on-mobile { + display: none + } +} + +@media (min-width:992px) { + .sidemenu-closed.sidemenu-closed-hidelogo .page-header.navbar .page-logo { + padding: 10px !important; + width: 45px + } + .sidemenu-closed.sidemenu-closed-hidelogo .page-header.navbar .page-logo .logo-default { + display: none + } + .page-boxed .page-header.navbar .page-logo { + width: 236px + } + .page-boxed .page-header.navbar .top-menu .navbar-nav { + margin-right: 0 + } + .sidemenu-closed.sidemenu-closed-hidelogo.page-boxed .page-header.navbar .page-logo { + width: 46px + } + .page-boxed.sidemenu-container-fixed .page-header.navbar .page-logo { + width: 235px + } + .sidemenu-container { + width: 235px; + float: left; + position: relative; + margin-right: -100% + } + .page-full-width .sidemenu-container { + display: none !important + } + .sidemenu-container.collapse { + display: block; + max-height: none !important + } + .sidemenu-container-reversed .sidemenu-container { + float: right; + margin-right: 0; + margin-left: -100% + } + .sidemenu-container-reversed.sidemenu-container-fixed .sidemenu-container { + margin-left: -235px + } + .sidemenu-container-reversed.sidemenu-container-fixed .sidebar-container { + position: relative; + float: right + } + .sidemenu-container-fixed .sidemenu-container { + position: fixed !important; + margin-left: 0; + top: 50px + } + .sidemenu-container-fixed .sidemenu>li.last { + margin-bottom: 15px !important + } + .sidemenu-container-fixed .sidemenu .sub-menu { + height: auto !important + } + .sidemenu-closed .sidemenu-container, + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed { + width: 45px !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li.open>.sub-menu, + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li>.sub-menu { + display: none !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover { + width: 256px !important; + position: relative !important; + z-index: 10000; + display: block !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>a { + -webkit-border-radius: 0 4px 0 0; + -moz-border-radius: 0 4px 0 0; + -ms-border-radius: 0 4px 0 0; + -o-border-radius: 0 4px 0 0; + border-radius: 0 4px 0 0 + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>a>i { + margin-right: 10px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>a>.title { + display: inline !important; + padding-left: 15px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>a>.badge { + display: block !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>a>.selected { + display: none + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover.heading { + width: 45px !important; + box-shadow: none + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>.sub-menu { + width: 210px; + position: absolute; + z-index: 2000; + left: 46px; + margin-top: 0; + top: 100%; + display: block !important; + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + -ms-border-radius: 0 0 4px 4px; + -o-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>.sub-menu>li>a { + padding-left: 15px !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>.sub-menu>li>.sub-menu>li>a { + padding-left: 30px !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>.sub-menu>li>.sub-menu>li>.sub-menu>li>a { + padding-left: 45px !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li.heading>h3 { + display: none + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li.sidebar-toggler-wrapper .sidebar-toggler { + margin-right: 8px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li.sidebar-search-wrapper:hover, + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li.sidebar-toggler-wrapper:hover { + width: 45px !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li>a { + padding-left: 11px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li>a .selected { + right: -3px !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li>a>.arrow, + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li>a>.badge, + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed>li>a>.title { + display: none !important + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-toggler { + margin-left: 3px; + margin-right: 3px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search .input-group { + border-color: transparent; + margin-left: -4px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search .input-group .form-control { + display: none + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search .input-group .input-group-btn .btn { + display: block + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.sidebar-search-bordered .input-group { + padding: 5px 0 3px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open { + height: 40px; + margin-top: 15px; + margin-bottom: 14px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open .input-group { + width: 210px; + position: relative; + z-index: 1; + margin-left: 24px; + padding: 0 + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open .input-group .form-control { + background: 0 0; + border: 0; + display: block; + padding: 8px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open .input-group .input-group-btn .btn { + display: block; + margin-right: 8px; + margin-top: 1px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open .remove { + background-repeat: no-repeat; + width: 11px; + height: 11px; + margin: 10px -5px 8px -7px; + display: block; + float: left + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open.sidebar-search-bordered { + height: 38px; + margin-top: 23px; + margin-bottom: 23px + } + .sidemenu-closed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open.sidebar-search-bordered .input-group { + padding: 0 + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container { + margin-left: -45px; + width: 45px + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed>li>.sub-menu { + left: auto; + right: 46px + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed>li:hover { + margin-left: -211px + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>a { + -webkit-border-radius: 4px 0 0; + -moz-border-radius: 4px 0 0; + -ms-border-radius: 4px 0 0 0; + -o-border-radius: 4px 0 0; + border-radius: 4px 0 0 + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>a>.title { + padding-left: 0; + padding-right: 15px + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed>li:hover>a>i { + margin-right: 0; + margin-left: 2px + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed>li.sidebar-search-wrapper:hover, + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed>li.sidebar-toggler-wrapper:hover { + margin-left: 0 + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open .input-group { + margin-left: -227px + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open .input-group .input-group-btn .btn { + margin-right: 10px !important + } + .sidemenu-closed.sidemenu-container-reversed .sidemenu-container .sidemenu.sidemenu-closed .sidebar-search.open .remove { + margin: 9px 4px 12px -16px !important; + float: right !important + } + .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover { + width: 235px !important; + display: block; + z-index: 10000 + } + .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .selected, + .sidemenu-closed.sidemenu-container-hide .sidemenu-container { + display: none !important + } + .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu { + width: 235px !important + } + .sidemenu-closed.sidemenu-container-fixed.sidemenu-container-reversed .sidemenu-container:hover { + width: 235px !important; + z-index: 10000; + margin-left: -235px !important + } + .sidemenu-closed.sidemenu-container-fixed.sidemenu-container-reversed .sidemenu-container:hover .sidemenu { + width: 235px !important + } + .sidemenu.sidemenu-hover-submenu li .sub-menu { + display: none; + width: 210px; + z-index: 2000; + position: absolute; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px + } + .sidemenu.sidemenu-hover-submenu li .sub-menu>li>a { + margin: 3px + } + .sidemenu.sidemenu-hover-submenu li.active .sub-menu, + .sidemenu.sidemenu-hover-submenu li.open .sub-menu { + display: none !important + } + .sidemenu.sidemenu-hover-submenu li a>.arrow { + display: none + } + .sidemenu.sidemenu-hover-submenu li:hover>a>.arrow { + display: block; + float: right; + position: absolute; + right: 0; + margin-top: -20px; + background: 0 0; + width: 0; + height: 0; + border-style: solid; + border-top: 12px double transparent; + border-bottom: 12px double transparent; + border-left: 0 + } + .sidemenu.sidemenu-hover-submenu li:hover>a>.arrow:after, + .sidemenu.sidemenu-hover-submenu li:hover>a>.arrow:before { + display: none + } + .sidemenu-container-reversed .sidemenu.sidemenu-hover-submenu li:hover>a>.arrow { + right: auto; + left: 0; + border-right: 0 + } + .sidemenu.sidemenu-hover-submenu li:hover>.sub-menu { + display: inline-block !important + } + .sidemenu.sidemenu-hover-submenu>li:hover>a>.arrow { + z-index: 1; + right: 0; + margin-top: -23px + } + .sidemenu.sidemenu-hover-submenu>li:hover>a>.selected { + display: none + } + .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu { + margin-left: 235px; + margin-top: -40px + } + .sidemenu-container-reversed .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu { + margin-left: -210px !important + } + .sidemenu-closed .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu { + margin-left: 0 + } + .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu>li>a { + padding-left: 15px + } + .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu>li .sub-menu { + margin-left: 210px; + margin-top: -38px !important + } + .sidemenu-container-reversed .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu>li .sub-menu { + margin-left: -210px !important + } + .sidemenu.sidemenu-hover-submenu>li:hover>.sub-menu>li .sub-menu>li>a { + padding-left: 10px; + padding-right: 10px + } + .page-content-wrapper { + float: left; + width: 100% + } + .page-content-wrapper .page-content { + margin-left: 235px; + margin-top: 0; + min-height: 600px; + padding: 25px 20px 10px + } + .page-content-wrapper .page-content.no-min-height { + min-height: auto + } + .sidemenu-container-fixed.sidemenu-container-hover-on .page-content-wrapper .page-content { + margin-left: 45px + } + .sidemenu-container-reversed .page-content-wrapper .page-content { + margin-left: 0 !important; + margin-right: 235px !important + } + .sidemenu-container-reversed.sidemenu-container-fixed.sidemenu-container-hover-on .page-content-wrapper .page-content { + margin-left: 0; + margin-right: 45px + } + .sidemenu-container-reversed.sidemenu-closed .page-content-wrapper .page-content { + margin-left: 0 !important; + margin-right: 45px !important + } + .sidemenu-closed .page-content-wrapper .page-content { + margin-left: 45px !important + } + .page-full-width .page-content-wrapper .page-content, + .sidemenu-closed.sidemenu-container-hide .page-content-wrapper .page-content { + margin-left: 0 !important + } + .sidemenu-closed.sidemenu-container-reversed.sidemenu-container-hide .page-content-wrapper .page-content { + margin-right: 0 !important + } + .page-footer { + clear: left + } + .page-footer-fixed .page-footer { + position: fixed; + left: 0; + right: 0; + z-index: 10000; + bottom: 0 + } + .sidemenu-container-fixed.sidemenu-closed .page-footer { + margin-left: 45px + } + .sidemenu-container-fixed.page-footer-fixed .page-footer { + margin-left: 0 !important + } + .sidemenu-container-fixed .page-footer { + margin-left: 235px; + padding: 8px 20px 5px + } + .page-boxed .page-footer { + padding: 8px 0 5px + } + .page-boxed.sidemenu-container-fixed .page-footer { + padding-right: 20px; + padding-left: 20px + } + .sidemenu-container-reversed.sidemenu-container-fixed .page-footer { + margin-left: 0; + margin-right: 235px; + padding: 8px 20px 5px + } + .sidemenu-container-reversed.sidemenu-container-fixed.page-footer-fixed .page-footer { + margin-left: 0; + margin-right: 0 + } + .sidemenu-container-reversed.sidemenu-container-fixed.sidemenu-closed .page-footer { + margin-right: 45px + } + .scroll-to-top { + right: 20px + } + .page-footer-fixed .page-container { + margin-bottom: 20px !important + } +} + +@media (max-width:991px) { + .page-header.navbar { + /*padding: 0 20px; */ + position: relative; + clear: both + } + .page-header.navbar .page-logo { + width: auto; + padding: 10px 20px 0px 20px; + margin-right: 0px; + margin-left: 0 !important; + /*padding-left: 0 !important;*/ + background: transparent; + } + .header-white .page-logo a { + /*color: #000;*/ + } + .page-header.navbar .page-logo img { + margin-left: 4px !important + } + .page-header.navbar .menu-toggler.sidebar-toggler { + display: none !important + } + .page-header.navbar .top-menu .navbar-nav { + display: inline-block; + margin: 0; + } + .page-header.navbar .top-menu .navbar-nav>li { + float: left + } + .page-header.navbar .top-menu .navbar-nav .nav li.dropdown i { + display: inline-block; + position: relative; + top: 1px; + right: 0 + } + .page-header.navbar .top-menu .navbar-nav .open .dropdown-menu { + position: absolute + } + .page-header-fixed.page-header-fixed-mobile .navbar-fixed-top { + position: fixed + } + .page-boxed .page-header.navbar>.container { + max-width: none !important; + margin: 0 !important; + padding: 0 !important + } + .sidemenu-container, + .sidemenu-container.navbar-collapse.in { + border-top: 0 !important; + margin: 20px + } + .sidemenu-container .sidebar-toggler { + display: none + } + .sidemenu-container.navbar-collapse { + max-height: none + } + .sidemenu-container.navbar-collapse.in { + position: relative; + overflow: hidden !important; + overflow-y: auto !important; + display: block !important + } + .sidemenu-container.navbar-collapse.navbar-no-scroll { + max-height: none !important + } + .sidemenu-container .mega-menu-responsive-content { + padding: 10px 18px 10px 45px + } + .page-full-width .sidemenu { + display: block + } + .sidemenu-container-mobile-offcanvas .sidebar-container { + z-index: 10000; + position: fixed; + top: 0; + bottom: 0; + overflow-y: auto; + width: 235px; + left: -235px; + transition: all .3s + } + .sidemenu-container-mobile-offcanvas .sidebar-container .sidemenu-container { + margin: 0 !important + } + .sidemenu-container-mobile-offcanvas .sidebar-container .sidemenu-container .sidemenu { + width: 100%; + margin: 0 !important; + padding: 0 0 20px + } + .sidemenu-container-mobile-offcanvas .sidebar-container .sidemenu-container .sidemenu>li.sidebar-mobile-offcanvas-toggler { + display: block; + border: 0; + text-align: right + } + .sidemenu-container-mobile-offcanvas .sidebar-container .sidemenu-container .sidemenu>li.sidebar-mobile-offcanvas-toggler>a { + border: 0 + } + .sidemenu-container-mobile-offcanvas .sidebar-container .sidemenu-container .sidemenu>li.sidebar-mobile-offcanvas-toggler>a:hover { + background: 0 0 + } + .sidemenu-container-mobile-offcanvas.sidemenu-container-mobile-offcanvas-open .sidebar-container { + left: 0; + transition: all .3s + } + .sidemenu-container.fixed-menu { + position: relative; + } + body, + html { + overflow-x: hidden + } + .page-container-bg-solid .page-bar, + .page-content-white .page-bar { + margin-top: -20px + } + .page-boxed>.container { + max-width: none !important; + margin: 0 !important; + padding: 0 !important + } + .page-content-wrapper .page-content { + margin: 0 !important; + padding: 20px !important; + min-height: 280px + } + .sidemenu-container-mobile-offcanvas .page-wrapper { + left: 0; + transition: all .3s + } + .sidemenu-container-mobile-offcanvas .page-wrapper .page-header { + transition: all .3s + } + .sidemenu-container-mobile-offcanvas.sidemenu-container-mobile-offcanvas-open { + overflow-x: hidden; + transition: all .3s + } + .sidemenu-container-mobile-offcanvas.sidemenu-container-mobile-offcanvas-open .page-wrapper { + position: relative; + left: 235px; + transition: all .3s + } + .sidemenu-container-mobile-offcanvas.sidemenu-container-mobile-offcanvas-open .page-wrapper .page-header { + transition: all .3s + } + .page-boxed .page-footer { + padding-left: 0; + padding-right: 0 + } + .scroll-to-top { + bottom: 10px; + right: 10px + } + .scroll-to-top>i { + font-size: 28px + } + .page-container { + margin: 0 !important; + padding: 0 !important + } + .page-header-fixed.page-header-fixed-mobile .page-container { + margin-top: 50px !important + } +} +@media (max-width:815px) { + .chat-sidebar-container { + top: 106px; + } +} + +@media (min-width:768px) and (max-width:991px) { + .page-boxed .page-header.navbar { + margin: auto !important; + padding: 0 + } + .page-boxed .page-header.navbar>.container { + margin: auto !important + } + .sidemenu-container .btn-navbar.collapsed .arrow { + display: none + } + .sidemenu-container .btn-navbar .arrow { + position: absolute; + right: 25px; + width: 0; + height: 0; + top: 50px; + border-bottom: 15px solid #5f646b; + border-left: 15px solid transparent; + border-right: 15px solid transparent + } + .page-boxed>.container { + margin: auto !important + } +} + +@media (max-width:767px) { + .page-header.navbar { + /*padding: 0 10px*/ + } + .page-header.navbar .page-logo { + width: auto + } + .page-header.navbar .search-form.open { + z-index: 3; + left: 10px; + right: 10px; + position: absolute; + width: auto !important + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-extended>.dropdown-menu { + max-width: 255px; + width: 255px + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu { + margin-right: -110px + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu:after, + .page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu:before { + margin-right: 105px + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox .dropdown-menu { + margin-right: -90px + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox .dropdown-menu:after, + .page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox .dropdown-menu:before { + margin-right: 85px + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-tasks .dropdown-menu { + margin-right: -110px + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-tasks .dropdown-menu:after, + .page-header.navbar .top-menu .navbar-nav>li.dropdown-tasks .dropdown-menu:before { + margin-right: 110px + } + .page-content-wrapper .page-content { + padding: 20px 10px 10px !important; + overflow: hidden + } + .page-content-wrapper .page-content .page-title { + margin-bottom: 20px; + font-size: 18px + } + .page-content-wrapper .page-content .page-title small { + font-size: 13px; + padding-top: 3px + } + .page-boxed .page-footer, + .page-footer { + padding-left: 10px; + padding-right: 10px + } + .page-footer-fixed .page-footer .container { + padding-left: 0; + padding-right: 0 + } +} + +@media (max-width:580px) { + .page-header.navbar .top-menu .navbar-nav>li.dropdown-language .dropdown-toggle .langname, + .page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-toggle .username.username-hide-on-mobile { + display: none + } +} + +@media (max-width:591px){ + .page-header.navbar .top-menu .navbar-nav>li.dropdown.language-switch>.dropdown-toggle { + padding: 16px 5px 14px; + } +} + +@media (max-width:547px) { + .chat-sidebar-container { + top: 100px; + } +} +@media (max-width:516px) { + .chat-sidebar-container { + top: 120px; + } +} + +@media (max-width:480px) { + .page-header-fixed.page-header-fixed-mobile .page-header.navbar { + height: 100px + } + .page-header.navbar .top-menu { + display: block; + clear: both; + float: none + } + .page-header.navbar .top-menu .navbar-nav { + margin-right: 0 + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle { + padding: 19px 5px 10px; + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-language .dropdown-toggle { + padding: 16px 4px 13px 2px + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-toggle { + padding: 16px 0 13px 2px + } + form.search-form-opened{ + margin-left: 0; + max-width: 170px; + } + .sidemenu-container, + .sidemenu-container.in { + margin: 0 10px 10px !important + } + .page-header-fixed.page-header-fixed-mobile .sidemenu-container, + .page-header-fixed.page-header-fixed-mobile .sidemenu-container.in { + margin-top: 10px !important + } + .page-content-wrapper .page-content .page-title small { + display: block; + clear: both + } + .page-content-wrapper .page-content .page-title small { + display: block; + clear: both + } + .sidemenu-container, + .sidemenu-container.in { + margin: 0 10px 10px !important + } + .page-header-fixed.page-header-fixed-mobile .sidemenu-container, + .page-header-fixed.page-header-fixed-mobile .sidemenu-container.in { + margin-top: 10px !important + } + .page-header-fixed.page-header-fixed-mobile .page-container { + margin-top: 100px !important + } + .page-header-fixed.page-header-fixed-mobile .page-container { + margin-top: 100px !important + } + .page-header.navbar .top-menu .navbar-nav>li.dropdown{ + padding: 5px 6px; + } +} + +@media (max-width:420px) { + .page-header.navbar .page-logo { + width: 100%; + } + .chat-sidebar-container { + top: 168px; + } +} + +@media only screen and (min-width:991px) { + #cd-timeline { + margin-top: 3em; + margin-bottom: 3em; + } + #cd-timeline::before { + left: 50%; + margin-left: -2px; + } + .cd-timeline-block { + margin: 4em 0; + } + .cd-timeline-block:first-child { + margin-top: 0; + } + .cd-timeline-block:last-child { + margin-bottom: 0; + } + .cd-timeline-img { + width: 60px; + height: 60px; + left: 50%; + margin-left: -30px; + -webkit-transform: translateZ(0); + -webkit-backface-visibility: hidden; + } + .cssanimations .cd-timeline-img.is-hidden { + visibility: hidden; + } + .cssanimations .cd-timeline-img.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-1 0.6s; + -moz-animation: cd-bounce-1 0.6s; + animation: cd-bounce-1 0.6s; + } + .cd-timeline-content { + margin-left: 0; + padding: 1.6em; + width: 45%; + } + .cd-timeline-content::before { + top: 24px; + left: 100%; + border-color: transparent; + border-left-color: white; + } + .cd-timeline-content.cd-picture::before { + border-left-color: #75ce66; + } + .cd-timeline-content.cd-location::before { + border-left-color: #f0ca45; + } + .cd-timeline-content.cd-movie::before { + border-left-color: #c03b44; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content.cd-movie::before { + border-right-color: #c03b44; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content.cd-location::before { + border-right-color: #f0ca45; + } + .cd-timeline-content .cd-read-more { + float: left; + } + .cd-timeline-content .cd-date { + position: absolute; + width: 100%; + left: 122%; + top: 6px; + font-size: 16px; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content { + float: right; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content::before { + top: 24px; + left: auto; + right: 100%; + border-color: transparent; + border-right-color: white; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-read-more { + float: right; + } + .cd-timeline-block:nth-child(even) .cd-timeline-content .cd-date { + left: auto; + right: 122%; + text-align: right; + } + .cssanimations .cd-timeline-content.is-hidden { + visibility: hidden; + } + .cssanimations .cd-timeline-content.bounce-in { + visibility: visible; + -webkit-animation: cd-bounce-2 0.6s; + -moz-animation: cd-bounce-2 0.6s; + animation: cd-bounce-2 0.6s; + } + .cssanimations .cd-timeline-block:nth-child(even) .cd-timeline-content.bounce-in { + -webkit-animation: cd-bounce-2-inverse 0.6s; + -moz-animation: cd-bounce-2-inverse 0.6s; + animation: cd-bounce-2-inverse 0.6s; + } +} +@media (min-width: 1400px){ + .page-boxed .container { + width: 1370px; + max-width: 100%; + } + .page-boxed .page-header-inner.container { + display: block; + } +} +@media print { + body { + background-color: #fff !important + } + .hidden-print, + .page-bar, + .page-footer, + .chat-sidebar-container, + .sidebar-container, + .chatpane { + display: none + } + .page-container { + margin: 0 !important; + padding: 0 !important + } + .page-content { + min-height: 300px !important; + padding: 0 20px 20px !important; + margin: 0 !important + } +} \ No newline at end of file diff --git a/bassets/admin/css/style.css b/bassets/admin/css/style.css new file mode 100644 index 0000000..c83560f --- /dev/null +++ b/bassets/admin/css/style.css @@ -0,0 +1,910 @@ +/* + * Document : style.css + * Author : RedStar Theme + * Description: The common theme stylesheet + */ + + +/* Doctor list style*/ + +ul.docListWindow { + list-style-type: none; + padding: 0 10px; +} +ul.docListWindow li { + display: inline-block; + width: 100%; + border-bottom: 1px dashed #dcdcdc; + margin-bottom: 11px; + padding-bottom: 11px; +} + +ul.docListWindow li .prog-avatar { + width: 40px; + height: 40px; + float: left; + margin-right: 25px; +} + +ul.docListWindow li .prog-avatar img { + width: 100%; + border-radius: 50%; + -webkit-border-radius: 50%; +} + +ul.docListWindow .progress { + height: 10px; + text-indent: 0; + margin: 0; +} + +ul.docListWindow .progress-bar { + text-align: right; + padding-right: 15px; + line-height: 10px; + font-size: 10px; +} + +/* Notifications */ + +.noti-information .notification-list { + padding: 0; +} + +.notification-list a:first-child { + border-top: none; +} + +.noti-information .notification-list a { + padding: 10px 18px 10px 18px; +} +.notification-list a { + display: inline-block; + width: 100%; + padding: 20px 0; + border-top: 1px solid #f3f3f3; + color: #2b2b2c; + text-decoration: none; + font-size: 14px; +} + +.notification-list.not-list a span.icon { + margin-top: 5px; +} + +.notification-list.mail-list a span.icon { + padding: 3px 10px; + margin-top: 0px; + color: white; +} + +.notification-list a span.icon { + margin-right: 15px; + font-size: 16px; + float: left; +} + +.notification-list.mail-list.not-list { + background: #e7ecf1; +} + +.notification-list p, +.notification-list p small { + margin: 0; + padding: 0; +} + +.noti-information .mail-list .un-read, +.noti-information .mail-list .read { + right: 20px; +} + +.mail-list .single-mail { + position: relative; +} + +a.single-mail.text-center.view-all { + background: white; +} +.not-list span.icon { + width: 40px; + height: 40px; + line-height: 33px; + font-size: 12px; + text-align: center; + border-radius: 6px; +} + +.bg-primary{ + color: #fff; + background-color: #9c78cd; +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mail-list .un-read, +.mail-list .read { + position: absolute; + right: 0px; + top: 32px; + font-size: 12px; + color: #dfdfe2; +} +.vew-mail-header { + color: #666f7b; + font-weight: 700; +} +h4.vew-mail-header b { + font-weight: 700; +} +.fa-comments-o:before { + content: "\f0e6"; +} + +.bg-warning{ + color: #fff; + background-color: #ffd200; +} +.bg-success { + background: #5FC29D; +} + +.bg-orange { + background: #E67D21; +} + +.bg-blue { + background: #3598dc; +} + +.bg-purple { + background: #8E44AD; +} + +.bg-danger{ + color: #fff; + background-color: #e55957; +} + +.bg-danger { + background: #e55957; +} + +.panel-body { + padding: 15px; +} +.form-group { + margin-bottom: 15px; +} +.work-monitor .states { + width: 90%; +} +.compose-editor{ + padding-left: 15px; +} +.work-monitor .states .info { + display: inline-block; + width: 100%; + font-size: 15px; + margin: 10px 0 0 0; + font-weight: 500; +} + +.progress.progress-sm { + height: 8px; +} + +.work-monitor .title { + margin: 0 0 40px 0; +} + +.text-danger { + color: #f44336; +} + +.md { + line-height: inherit; + vertical-align: bottom; +} + +.md-refresh:before { + content: "\f2a4"; +} + +.card .btn-collapse { + -webkit-transition: all 0.1s ease-out; + -o-transition: all 0.1s ease-out; + transition: all 0.1s ease-out; +} + + +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + transform: translate(0, 0); +} + +.fa-angle-down:before { + content: "\f107"; +} +section.panel.tab-border { + border: 1px solid #e5e5e5; +} +.select.control { + background: #262936; + border-radius: 40px; + overflow: hidden; + display: inline-block; + vertical-align: middle; + padding-right: 30px; + position: relative; +} + +.select.control:after { + content: " "; + width: 7px; + height: 9px; + background: url(images/arrow-down.html); + position: absolute; + right: 10px; + top: 0; + bottom: 0; + margin: auto; + display: block; + z-index: 1; +} + +.select.control select { + padding: 10px 30px; + width: 110%; + border: none; + background: none; + outline: none; + -webkit-appearance: none; + color: white; +} + +/* widget */ +.sidebar .widget { + background: #262936; + border-radius: 10px; + padding: 20px; + margin-bottom: 30px; +} + +.sidebar .widget .widget-title { + font-size: 24px; + font-size: 1.7142857143em; + margin-bottom: 20px; + font-weight: 300; +} + +.sidebar .widget .arrow-list li { + border: none; +} + +.sidebar .widget.top-rated { + padding: 0; +} + +.sidebar .widget.top-rated .widget-title { + padding: 20px 20px 0; +} + +.sidebar .widget.top-rated ul { + list-style: none; +} + +.sidebar .widget.top-rated ul li { + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + padding: 10px 20px; +} + +.sidebar .widget.top-rated ul li:last-child { + border-bottom: none; +} + +.sidebar .widget.top-rated .entry-title { + font-size: 14px; + font-size: 1em; + margin-bottom: 5px; + font-weight: 300; +} + +.sidebar .widget.top-rated .entry-title a { + color: #bfc1c8; +} + +.sidebar .widget.top-rated .rating strong { + color: #009ad8; +} +.stat-item { + display: inline-block; + padding-right: 15px; +} +.stats-row { + margin-bottom: 20px; +} +.widget-gradient, +.widget-wrap-img { + min-height: 350px; + border-radius: 2px +} +.analysis-box{ + padding: 2px 25px 10px 20px; + margin-bottom: 20px; +} + +.megamenu-header { + display: block; + padding: 0px 20px 5px 0px; + font-size: 22px; + line-height: 1.428571429; + color: #fafafa; +} + +.mega-menu-item-name { + color: #fafafa; + padding: 10px 0px 10px 0px; +} + +.demo-container { + box-sizing: border-box; + width: 100%; + height: 450px; + padding: 20px 15px 15px 15px; + margin: 15px auto 30px auto; + border: 1px solid #ddd; + background: #fff; + background: linear-gradient(#f6f6f6 0, #fff 50px); + background: -o-linear-gradient(#f6f6f6 0, #fff 50px); + background: -ms-linear-gradient(#f6f6f6 0, #fff 50px); + background: -moz-linear-gradient(#f6f6f6 0, #fff 50px); + background: -webkit-linear-gradient(#f6f6f6 0, #fff 50px); + box-shadow: 0 3px 10px rgba(0, 0, 0, 0.15); + -o-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1); + -ms-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1); + -webkit-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1); +} + +.demo-placeholder { + width: 100%; + height: 100%; + font-size: 14px; + line-height: 1.2em; +} + +.legend table { + border-spacing: 5px; +} + +.clsAvailable { + color: #0cc745; + font-size: 13px; + font-weight: 600; +} + +.clsNotAvailable { + color: #ff0000; + font-size: 13px; + font-weight: 600; +} + +.clsOnLeave { + color: #32c5d2; + font-size: 13px; + font-weight: 600; +} + +.table-padding { + padding-bottom: 20px; + padding-top: 20px; +} +.doctitle { + padding-bottom: 5px; +} +.user-bg { + margin: -25px; + overflow: hidden; + position: relative; +} +.user-bg .overlay-box { + background: #9675ce; + opacity: .9; + top: 0; + left: 0; + right: 0; + height: 100%; + text-align: center; +} +.user-bg .overlay-box .user-content { + padding: 15px; +} +.user-btm-box { + padding: 40px 0 10px; + clear: both; + overflow: hidden; +} +.input-group-btn .btn { + box-shadow: none +} +.addr-font-h1 span { + font-size: 14px; + vertical-align: text-top; +} +.text-stat h3 { + margin-top: 5px; + margin-bottom: 0; + font-size: 18px +} +.text-stat span { + font-size: 13px!important +} + +.overflow-h { + overflow: hidden +} +.rt-code { + padding: 3px; + color: #E43A45; + border-radius: 4px!important; + display: inline; + word-wrap: normal +} +.caption-desc { + font-size: 13px; + margin-top: .5em; + line-height: 2.3em +} +.mail-label { + padding: .2em .6em .3em !important; +} +.mail-counter-style { + padding: 2px 6px 4px !important; +} +h4.media-heading { + color: #3D3D3D; + font-weight: 500; + font-family: Roboto,sans-serif; +} +.language-switch a { + color: #1E2629; +} +.notification-label { + float: right; + border-radius: 10px; + padding: 0px 10px; + color: #fff; +} + +.task-body .list-group-item { + border-width: 0 0 1px 0; + margin: 0; +} +.progress-line { + background: #e7ecf1; +} +span.notificationtime { + display: block; +} +span.online-status { + display: block; + margin-bottom: 0; + padding: 0 22px; + color: #9d9f9e; + font-size: 11px; + margin-top: 0px; +} +.addr-font-h3 { + font-size: 24px +} +.addr-font-h4 { + font-size: 18px +} +.close { + display: inline-block; + margin-top: 0; + margin-right: 0; + width: 9px; + height: 9px; + background-repeat: no-repeat!important; + text-indent: -10000px; + outline: 0; + background-image: url(../img/remove-icon-small.png)!important +} +.help-block { + margin-top: 5px; + margin-bottom: 5px +} +.help-inline { + font-size: 13px; + color: #737373; + display: inline-block; + padding: 5px +} +.input-mini, +.input-xxs { + width: 45px!important +} +.progress { + border: 0; + background-image: none; + filter: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + height: 8px; + border-radius: 0!important; + margin: 0; +} +.progress-bar-success { + background-color: #36c6d3; +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-bar-danger { + background-color: #d9534f; +} +.state-overview .addr-font-h1 { + font-size: 36px; + float: left; + width: auto; +} +.no-pad-left{ + padding-left: 0 !important; +} +.text-purple .fa-facebook { + font-size: 20px; +} +.text-success .fa-twitter { + font-size: 20px; +} +.text-danger .fa-instagram { + font-size: 20px; +} +.refresh-block { + width: 100%; + height: 100%; + background-color: rgba(255, 255, 255, .8); + -webkit-transition: all .05s ease; + transition: all .05s ease; + top: 0px; + left: 0px; + position: absolute; + z-index: 1000; + border-radius: 2px; +} +.refresh-block .refresh-loader { + display: inline-block; + position: absolute; + text-align: center; + top: 50%; + left: 50%; + margin-left: -16px; + margin-top: -16px; +} +.refresh-block .refresh-loader i { + display: inline-block; + line-height: 32px; + color: #000; + font-size: 16px; +} + +/* Social Buttons */ +.btn-facebook { + color: #ffffff !important; + background-color: #3b5998 !important; +} +.btn-twitter { + color: #ffffff !important; + background-color: #00aced !important; +} +.btn-linkedin { + color: #ffffff !important; + background-color: #007bb6 !important; +} +.btn-dribbble { + color: #ffffff !important; + background-color: #ea4c89 !important; +} +.btn-googleplus { + color: #ffffff !important; + background-color: #dd4b39 !important; +} +.btn-instagram { + color: #ffffff !important; + background-color: #517fa4 !important; +} +.btn-pinterest { + color: #ffffff !important; + background-color: #cb2027 !important; +} +.btn-dropbox { + color: #ffffff !important; + background-color: #007ee5 !important; +} +.btn-flickr { + color: #ffffff !important; + background-color: #ff0084 !important; +} +.btn-tumblr { + color: #ffffff !important; + background-color: #32506d !important; +} +.btn-skype { + color: #ffffff !important; + background-color: #00aff0 !important; +} +.btn-youtube { + color: #ffffff !important; + background-color: #bb0000 !important; +} +.btn-github { + color: #ffffff !important; + background-color: #171515 !important; +} +.app-search { + position: relative; +} +.contact-detail { + float: left; + width: 100%; +} +.contact-detail .fa { + float: left; + width: 30px; + font-size: 20px; + margin-top: 5px; +} +.contact-detail span { + float: left; + width: calc(100% - 30px); + margin-bottom: 20px; +} +.contact-detail .fa-envelope { + font-size: 15px; +} +.contact-detail .fa-mobile { + font-size: 25px; +} +.item img { + max-width: 100%; +} +.dataTables_wrapper { + margin-top: 15px; +} +tr.group, +tr.group:hover { + background-color: #ddd !important; +} +.profile-userpic { + float: left; + width: 100%; + text-align: center; +} + +/*-----------------Theme color style------------------------------*/ +.control-sidebar-btn.btn { + position: absolute; + left: -53px; + padding: 25px; + z-index: 999; + border-radius: 100%; + width: 35px; + height: 35px; + font-size: 18px; + color: #fff; + border-color: #2f323e; + background-color: #2f323e; + margin: 0; +} +.control-sidebar-btn i { + position: absolute; + top: 18px; + left: 15px; +} +.display-none{ + display: none; +} +/* Theme color CSS */ +.control-sidebar-btn.btn { + position: absolute; + left: -53px; + padding: 25px; + z-index: 999; + border-radius: 100%; + width: 35px; + height: 35px; + font-size: 18px; + color: #fff; + border-color: #2f323e; + background-color: #2f323e; + margin: 0; +} +.control-sidebar-btn i { + position: absolute; + top: 18px; + left: 15px; +} +.quick-setting-main { + float: left; + position: fixed; + top: 25%; + z-index: 99999; + right: 0; +} +.quick-setting { + float: left; + background-color: #eee; + border: 5px solid #ddd; + display: none; + margin-top: -15px; + max-width: 380px; + padding: 20px; +} +.quick-setting ul#themecolors li { + list-style: none; +} +.quick-setting ul#themecolors { + padding: 0; + margin: 0; + float: left; + width: 100%; + max-width: 330px; +} +.quick-setting ul#themecolors li a { + width: 32px; + height: 32px; + display: inline-block; + margin: 5px; + color: transparent; + position: relative; + background-color: #EAEEF3; +} +.quick-setting ul#themecolors li a.green-theme { + background-color: #0f0; +} +.quick-setting ul#themecolors li a.turquoise { + background-color: #00c5cd; +} +.theme-color a { + border-radius: 4px; + cursor: pointer; + display: inline-block; + margin: 5px 8px 5px 0; + -webkit-box-shadow: 0.4px 0.9px 3px 0 rgba(0,0,0,0.33); + box-shadow: 0.4px 0.9px 3px 0 rgba(0,0,0,0.33); + overflow: hidden; + width: 45px; + height: 40px; +} +.theme-color a[data-theme="white"] .head:before, +.theme-color a[data-theme="white"] .head:after, +.theme-color a[data-theme="dark"] .head:before, +.theme-color a[data-theme="blue"] .head:before, +.theme-color a[data-theme="indigo"] .head:before, +.theme-color a[data-theme="red"] .head:before, +.theme-color a[data-theme="cyan"] .head:before, +.theme-color a[data-theme="logo-white"] .head:before, +.theme-color a[data-theme="logo-white"] .head:after, +.theme-color a[data-theme="logo-dark"] .head:before, +.theme-color a[data-theme="logo-blue"] .head:before, +.theme-color a[data-theme="logo-indigo"] .head:before, +.theme-color a[data-theme="logo-cyan"] .head:before, +.theme-color a[data-theme="logo-green"] .head:before, +.theme-color a[data-theme="logo-red"] .head:before, +.theme-color a[data-theme="header-white"] .head:before, +.theme-color a[data-theme="header-white"] .head:after{ + background: #fff; +} +.theme-color a[data-theme="white"] .cont:after{ + background: #fff; +} +.theme-color a[data-theme="dark"] .cont:after, +.theme-color a[data-theme="header-dark"] .head:before, +.theme-color a[data-theme="header-dark"] .head:after{ + background: #303548; +} +.theme-color a[data-theme="blue"] .cont:after, +.theme-color a[data-theme="blue"] .head:after, +.theme-color a[data-theme="logo-blue"] .head:after, +.theme-color a[data-theme="header-blue"] .head:before, +.theme-color a[data-theme="header-blue"] .head:after{ + background: #5093EB; +} +.theme-color a[data-theme="indigo"] .cont:after, +.theme-color a[data-theme="indigo"] .head:after, +.theme-color a[data-theme="logo-indigo"] .head:after, +.theme-color a[data-theme="header-indigo"] .head:before, +.theme-color a[data-theme="header-indigo"] .head:after{ + background: #6673FC; +} +.theme-color a[data-theme="cyan"] .cont:after, +.theme-color a[data-theme="cyan"] .head:after, +.theme-color a[data-theme="logo-cyan"] .head:after, +.theme-color a[data-theme="header-cyan"] .head:before, +.theme-color a[data-theme="header-cyan"] .head:after{ + background: #4ABAD2; +} +.theme-color a[data-theme="green"] .cont:after, +.theme-color a[data-theme="green"] .head:after, +.theme-color a[data-theme="logo-green"] .head:after, +.theme-color a[data-theme="header-green"] .head:before, +.theme-color a[data-theme="header-green"] .head:after{ + background: #49D075; +} +.theme-color a[data-theme="red"] .cont:after, +.theme-color a[data-theme="red"] .head:after, +.theme-color a[data-theme="logo-red"] .head:after, +.theme-color a[data-theme="header-red"] .head:before, +.theme-color a[data-theme="header-red"] .head:after{ + background: #E44F56; +} +.theme-color a[data-theme="dark"] .head:after, +.theme-color a[data-theme="logo-dark"] .head:after{ + background: #303548; +} +.layout-theme a[data-theme="dark"] .cont{ + background: #464545; +} +.layout-theme a[data-theme="dark"] .head:before{ + background: #242b3a; +} +.layout-theme a[data-theme="light"] .cont{ + background: #ffffff; +} +.layout-theme a[data-theme="light"] .head:before{ + background: #ffffff; +} +.layout-theme a[data-theme="light"] .head:after{ + background: #6673FC; +} + +.theme-color a .head { + height: 10px; +} +.theme-color a .cont, .theme-color a .head { + display: block; + position: relative; +} +.theme-color a .cont:before, .theme-color a .head:before { + width: 60%; + right: 0; +} +.theme-color a .cont:after, .theme-color a .cont:before, .theme-color a .head:after, .theme-color a .head:before { + content: ""; + height: 100%; + display: inline-block; + position: absolute; +} +.theme-color a .cont:after, .theme-color a .head:after { + width: 40%; + left: 0; +} +.theme-color a .cont { + height: 40px; +} +.theme-color a .cont:after, .theme-color a .head:after { + width: 40%; + left: 0; +} +.selector-title{ + margin-top: 0px !important; + color: #000000; +} +.mega-menu-dropdown .material-icons { + float: left; + line-height: 24px; +} +.mega-menu-dropdown .dropdown-toggle { + line-height: 24px; +} \ No newline at end of file diff --git a/bassets/admin/css/theme-color.css b/bassets/admin/css/theme-color.css new file mode 100644 index 0000000..aeb7aaa --- /dev/null +++ b/bassets/admin/css/theme-color.css @@ -0,0 +1,1429 @@ +/* + * Document : theme-color.css + * Author : RedStar Theme + * Description: stylesheet for change theme color, user can set any custom color for template, User have to just replace three classes + (header-white white-sidebar-color logo-indigo) with (custom-sidebar-color logo-custom header-custom) classes in template tag + and set bellow variable color as per desire. Thats It !!!!!! + */ + + :root { + --sidebar-color: #ffffff; + --sidebar-font-color: #4680ff; + --logo-color: #222c3c; + --header-color: #6673FC; +} + +/* + --white-color: #ffffff; + --dark-color: #222c3c; + --blue-color: #1880c9; + --indigo-color: #6673FC; + --cyan-color: #4ABAD2; + --green-color: #3FCC7E; + --red-color: #E44F56; +*/ + + +/* Custom Theme Color */ +.custom-sidebar-color .sidemenu-container { + background-color: var(--sidebar-color); +} +.custom-sidebar-color .sidemenu-container .sidemenu>li.active.open>a, +.custom-sidebar-color .sidemenu-container .sidemenu>li.active>a, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + background-color: #ffffff; + border-top-color: transparent; + color: var(--sidebar-font-color); +} +.custom-sidebar-color .sidemenu-container .sidemenu>li>a, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a{ + color: #555; + border-bottom:none; + background-color: var(--sidebar-color); +} +.custom-sidebar-color .user-panel{ + color: #444; +} +.custom-sidebar-color .txtOnline{ + color: #444; +} + +.custom-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow.open:before, +.custom-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow:before, +.custom-sidebar-color .sidemenu-container .sidemenu>li.open>a>i, +.custom-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow.open:before, +.custom-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow:before, +.custom-sidebar-color .sidemenu-container .sidemenu>li:hover>a>i, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow.open:before, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow:before, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>i, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow.open:before, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow:before, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>i{ + color: var(--sidebar-font-color); +} +.custom-sidebar-color .sidemenu-container .sidemenu .sub-menu, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu{ + background-color: #F5F5F5; +} +.custom-sidebar-color .sidemenu-container .sidemenu .sub-menu>li>a, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a{ + color : #444; +} +.custom-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.active>a, +.custom-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.open>a, +.custom-sidebar-color .sidemenu-container .sidemenu .sub-menu>li:hover>a, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a, +.custom-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a{ + color: var(--sidebar-font-color); +} +.custom-sidebar-color .page-container{ + background-color : #ffffff; +} +.selector-title{ + margin-top: 0px !important; +} +.custom-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow{ + border-right: 8px solid var(--sidebar-font-color); +} +.custom-sidebar-color .sidemenu-hover-submenu li:hover>.sub-menu{ + background-color: #F5F5F5; +} + +.logo-custom .page-header.navbar .page-logo{ + background: var(--logo-color); +} + +.header-custom .page-header.navbar{ + background-color: var(--header-color); +} +.header-custom form.search-form-opened .btn.submit { + color: #fff; +} +.header-custom .search-form-opened input[type="text"]{ + color:#fff; +} +.header-custom form.search-form-opened { + background-color: rgba(255, 255, 255, 0.3); + border: 0; +} +.header-custom .page-header .search-form-opened .input-group .form-control::-moz-placeholder { + color: #efefef; + opacity: 1; +} +.header-custom .page-header .search-form-opened .input-group .form-control:-ms-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-custom .page-header .search-form-opened .input-group .form-control::-webkit-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-custom .page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>.langname, +.header-custom .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>.username, +.header-custom .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>i{ + color: #fff; +} +.header-custom .page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle>i{ + color: #fff; +} +.header-custom .language-switch a{ + color: #fff; +} +.header-custom .menu-toggler i.icon-menu{ + color: #ffffff; + font-size: 18px; +} +.header-custom .page-header.navbar .hor-menu .navbar-nav>li.active>a, +.header-custom .page-header.navbar .hor-menu .navbar-nav>li.current>a{ + background-color: transparent; +} +.header-custom .dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover{ + background-color: transparent; +} +.header-custom .dropdown-menu>li.active:hover>a, +.header-custom .dropdown-menu>li.active>a, +.header-custom .dropdown-menu>li:hover>a{ + background-color: transparent; +} + +.header-custom .language-switch a.dropdown-toggle{ + color:#fff; +} + + + +/* White sidebar color */ +.white-sidebar-color .sidemenu-container { + background-color: #ffffff; +} +.white-sidebar-color .sidemenu-container .sidemenu>li.active.open>a, +.white-sidebar-color .sidemenu-container .sidemenu>li.active>a, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + background-color: #ffffff; + border-top-color: transparent; + color: #4680ff; +} +/* .white-sidebar-color .sidemenu-container .sidemenu>li>a{ + color: #555; + border-bottom:none; + background-color: #ffffff; +} */ +.white-sidebar-color .sidemenu-container .sidemenu>li.open>a, +.white-sidebar-color .sidemenu-container .sidemenu>li:hover>a, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a{ + background-color: #ffffff; + border-top-color: transparent; + color: #4680ff; +} +.white-sidebar-color .user-panel, +.white-sidebar-color .txtOnline, +.white-sidebar-color .sidemenu-container .sidemenu>li>a, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a{ + color: #444; +} +.white-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow.open:before, +.white-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow:before, +.white-sidebar-color .sidemenu-container .sidemenu>li.open>a>i, +.white-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow.open:before, +.white-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow:before, +.white-sidebar-color .sidemenu-container .sidemenu>li:hover>a>i, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow.open:before, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow:before, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>i, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow.open:before, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow:before, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>i{ + color: #4680ff; +} +.white-sidebar-color .sidemenu-container .sidemenu .sub-menu, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu{ + background-color: #F5F5F5; +} +.white-sidebar-color .sidemenu-container .sidemenu .sub-menu>li>a, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a{ + color : #444; +} +.white-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.active>a, +.white-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.open>a, +.white-sidebar-color .sidemenu-container .sidemenu .sub-menu>li:hover>a, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a{ + color: #4680ff; +} +.white-sidebar-color .page-container{ + background-color : #ffffff; +} +.selector-title{ + margin-top: 0px !important; +} +.white-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow{ + border-right: 8px solid #4680ff; +} +.white-sidebar-color .sidemenu-hover-submenu li:hover>.sub-menu{ + background-color: #F5F5F5; +} +.white-sidebar-color .sidemenu-container .sidemenu>li.active>a>i, +.white-sidebar-color .sidemenu-container .sidemenu li.active>a>.arrow.open:before, +.white-sidebar-color .sidemenu-container .sidemenu li.active>a>.arrow:before, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li.active>a>.arrow.open:before, +.white-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li.active>a>.arrow:before{ + color: #4680ff; +} +.white-sidebar-color .sidemenu-container .sidemenu .sub-menu>li:hover>a>i{ + color: #4680ff; +} + +/* Dark sidebar color */ +.dark-sidebar-color .sidemenu-container { + background-color: #222c3c; +} +.dark-sidebar-color .sidemenu-container .sidemenu>li.active.open>a, +.dark-sidebar-color .sidemenu-container .sidemenu>li.active>a, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + background-color: #1e293c; + border-top-color: transparent; + color: #fff; +} +.dark-sidebar-color .sidemenu-container .sidemenu>li>a, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a{ + color: #b7c0cd; + border-bottom:none; +} +.dark-sidebar-color .user-panel{ + color: #ccc; +} +.dark-sidebar-color .txtOnline{ + color: #ccc; +} +.dark-sidebar-color .sidemenu-container .sidemenu>li.open>a, +.dark-sidebar-color .sidemenu-container .sidemenu>li:hover>a, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a { + background-color: #222c3c; + color: #fff; +} +.dark-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow.open:before, +.dark-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow:before, +.dark-sidebar-color .sidemenu-container .sidemenu>li.open>a>i, +.dark-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow.open:before, +.dark-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow:before, +.dark-sidebar-color .sidemenu-container .sidemenu>li:hover>a>i, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow.open:before, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow:before, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>i, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow.open:before, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow:before, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>i{ + color: #fff; +} +.dark-sidebar-color .sidemenu-container .sidemenu .sub-menu, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu{ + background-color: #1e293c; +} +.dark-sidebar-color .sidemenu-container .sidemenu .sub-menu>li>a, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a{ + color: rgba(255,255,255,0.5); +} +.dark-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.active>a, +.dark-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.open>a, +.dark-sidebar-color .sidemenu-container .sidemenu .sub-menu>li:hover>a, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a{ + color: #fff; +} +.dark-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow.open:before, +.dark-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow:before, +.dark-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>i, +.dark-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow.open:before, +.dark-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow:before, +.dark-sidebar-color .sidemenu-container .sidemenu>li.active>a>i, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow.open:before, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow:before, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>i, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow.open:before, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow:before, +.dark-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>i{ + color: #fff; +} +.dark-sidebar-color .page-container{ + background-color : #222c3c; +} +.dark-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow { + border-right: 8px solid #fff; +} + +/* Blue sidebar color */ +.blue-sidebar-color .sidemenu-container { + background-color: #1880c9; +} +.blue-sidebar-color .sidemenu-container .sidemenu>li.active.open>a, +.blue-sidebar-color .sidemenu-container .sidemenu>li.active>a, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + background-color: #186fad; + border-top-color: transparent; + color: #fff; +} +.blue-sidebar-color .sidemenu-container .sidemenu>li>a, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a{ + color: rgba(255, 255, 255, 0.8); + border-bottom:none; +} +.blue-sidebar-color .user-panel{ + color: #fff; +} +.blue-sidebar-color .txtOnline{ + color: #fff; +} +.blue-sidebar-color .sidemenu-container .sidemenu>li.open>a, +.blue-sidebar-color .sidemenu-container .sidemenu>li:hover>a, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a { + background-color: #1880c9; + color: #fff; +} +.blue-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow.open:before, +.blue-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow:before, +.blue-sidebar-color .sidemenu-container .sidemenu>li.open>a>i, +.blue-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow.open:before, +.blue-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow:before, +.blue-sidebar-color .sidemenu-container .sidemenu>li:hover>a>i, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow.open:before, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow:before, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>i, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow.open:before, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow:before, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>i{ + color: #fff; +} +.blue-sidebar-color .sidemenu-container .sidemenu .sub-menu, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu{ + background-color: #186fad +} +.blue-sidebar-color .sidemenu-container .sidemenu .sub-menu>li>a, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a{ + color: rgba(255, 255, 255, 0.8); +} +.blue-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.active>a, +.blue-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.open>a, +.blue-sidebar-color .sidemenu-container .sidemenu .sub-menu>li:hover>a, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a{ + color: #fff; +} +.blue-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow.open:before, +.blue-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow:before, +.blue-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>i, +.blue-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow.open:before, +.blue-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow:before, +.blue-sidebar-color .sidemenu-container .sidemenu>li.active>a>i, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow.open:before, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow:before, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>i, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow.open:before, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow:before, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>i{ + color: #fff; +} +.blue-sidebar-color .page-container{ + background-color : #1880c9; +} +.blue-sidebar-color .sidemenu-container .sidemenu>li.heading>h3, +.blue-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.heading>h3{ + color: #fff; +} +.blue-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow { + border-right: 8px solid #fff; +} + + +/* Indigo sidebar color */ +.indigo-sidebar-color .sidemenu-container { + background-color: #6673FC; +} +.indigo-sidebar-color .sidemenu-container .sidemenu>li.active.open>a, +.indigo-sidebar-color .sidemenu-container .sidemenu>li.active>a, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + background-color: #545ed6; + border-top-color: transparent; + color: #fff; +} +.indigo-sidebar-color .sidemenu-container .sidemenu>li>a, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a{ + color: rgba(255, 255, 255, 0.8); + border-bottom:none; +} +.indigo-sidebar-color .user-panel{ + color: #fff; +} +.indigo-sidebar-color .txtOnline{ + color: #fff; +} +.indigo-sidebar-color .sidemenu-container .sidemenu>li.open>a, +.indigo-sidebar-color .sidemenu-container .sidemenu>li:hover>a, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a { + background-color: #6673FC; + color: #fff; +} +.indigo-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow.open:before, +.indigo-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow:before, +.indigo-sidebar-color .sidemenu-container .sidemenu>li.open>a>i, +.indigo-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow.open:before, +.indigo-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow:before, +.indigo-sidebar-color .sidemenu-container .sidemenu>li:hover>a>i, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow.open:before, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow:before, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>i, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow.open:before, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow:before, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>i{ + color: #fff; +} +.indigo-sidebar-color .sidemenu-container .sidemenu .sub-menu, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu{ + background-color: #545ed6; +} +.indigo-sidebar-color .sidemenu-container .sidemenu .sub-menu>li>a, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a{ + color: rgba(255, 255, 255, 0.8); +} +.indigo-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.active>a, +.indigo-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.open>a, +.indigo-sidebar-color .sidemenu-container .sidemenu .sub-menu>li:hover>a, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a{ + color: #fff; +} +.indigo-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow.open:before, +.indigo-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow:before, +.indigo-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>i, +.indigo-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow.open:before, +.indigo-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow:before, +.indigo-sidebar-color .sidemenu-container .sidemenu>li.active>a>i, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow.open:before, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow:before, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>i, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow.open:before, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow:before, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>i{ + color: #fff; +} +.indigo-sidebar-color .page-container{ + background-color : #6673FC; +} +.indigo-sidebar-color .sidemenu-container .sidemenu>li.heading>h3, +.indigo-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.heading>h3{ + color: #fff; +} +.indigo-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow { + border-right: 8px solid #fff; +} + + +/* Cyan sidebar color */ +.cyan-sidebar-color .sidemenu-container { + background-color: #4ABAD2; +} +.cyan-sidebar-color .sidemenu-container .sidemenu>li.active.open>a, +.cyan-sidebar-color .sidemenu-container .sidemenu>li.active>a, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + background-color: #34a3bc; + border-top-color: transparent; + color: #fff; +} +.cyan-sidebar-color .sidemenu-container .sidemenu>li>a, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a{ + color: rgba(255, 255, 255, 0.8); + border-bottom:none; +} +.cyan-sidebar-color .user-panel{ + color: #fff; +} +.cyan-sidebar-color .txtOnline{ + color: #fff; +} +.cyan-sidebar-color .sidemenu-container .sidemenu>li.open>a, +.cyan-sidebar-color .sidemenu-container .sidemenu>li:hover>a, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a { + background-color: #4ABAD2; + color: #fff; +} +.cyan-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow.open:before, +.cyan-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow:before, +.cyan-sidebar-color .sidemenu-container .sidemenu>li.open>a>i, +.cyan-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow.open:before, +.cyan-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow:before, +.cyan-sidebar-color .sidemenu-container .sidemenu>li:hover>a>i, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow.open:before, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow:before, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>i, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow.open:before, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow:before, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>i{ + color: #fff; +} +.cyan-sidebar-color .sidemenu-container .sidemenu .sub-menu, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu{ + background-color: #34A3BC +} +.cyan-sidebar-color .sidemenu-container .sidemenu .sub-menu>li>a, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a{ + color: rgba(255, 255, 255, 0.8); +} +.cyan-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.active>a, +.cyan-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.open>a, +.cyan-sidebar-color .sidemenu-container .sidemenu .sub-menu>li:hover>a, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a{ + color: #fff; +} +.cyan-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow.open:before, +.cyan-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow:before, +.cyan-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>i, +.cyan-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow.open:before, +.cyan-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow:before, +.cyan-sidebar-color .sidemenu-container .sidemenu>li.active>a>i, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow.open:before, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow:before, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>i, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow.open:before, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow:before, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>i{ + color: #fff; +} +.cyan-sidebar-color .page-container{ + background-color : #4ABAD2; +} +.cyan-sidebar-color .sidemenu-container .sidemenu>li.heading>h3, +.cyan-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.heading>h3{ + color: #fff; +} +.cyan-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow { + border-right: 8px solid #fff; +} +/* Green sidebar color */ +.green-sidebar-color .sidemenu-container { + background-color: #3FCC7E; +} +.green-sidebar-color .sidemenu-container .sidemenu>li.active.open>a, +.green-sidebar-color .sidemenu-container .sidemenu>li.active>a, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + background-color: #3fa961; + border-top-color: transparent; + color: #fff; +} +.green-sidebar-color .sidemenu-container .sidemenu>li>a, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a{ + color: rgba(255, 255, 255, 0.8); + border-bottom:none; +} +.green-sidebar-color .user-panel{ + color: #fff; +} +.green-sidebar-color .txtOnline{ + color: #fff; +} +.green-sidebar-color .sidemenu-container .sidemenu>li.open>a, +.green-sidebar-color .sidemenu-container .sidemenu>li:hover>a, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a { + background-color: #3FCC7E; + color: #fff; +} +.green-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow.open:before, +.green-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow:before, +.green-sidebar-color .sidemenu-container .sidemenu>li.open>a>i, +.green-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow.open:before, +.green-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow:before, +.green-sidebar-color .sidemenu-container .sidemenu>li:hover>a>i, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow.open:before, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow:before, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>i, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow.open:before, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow:before, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>i{ + color: #fff; +} +.green-sidebar-color .sidemenu-container .sidemenu .sub-menu, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu{ + background-color: #3fa961; +} +.green-sidebar-color .sidemenu-container .sidemenu .sub-menu>li>a, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a{ + color: rgba(255, 255, 255, 0.8); +} +.green-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.active>a, +.green-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.open>a, +.green-sidebar-color .sidemenu-container .sidemenu .sub-menu>li:hover>a, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a{ + color: #fff; +} +.green-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow.open:before, +.green-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow:before, +.green-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>i, +.green-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow.open:before, +.green-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow:before, +.green-sidebar-color .sidemenu-container .sidemenu>li.active>a>i, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow.open:before, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow:before, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>i, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow.open:before, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow:before, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>i{ + color: #fff; +} +.green-sidebar-color .page-container{ + background-color : #3FCC7E; +} +.green-sidebar-color .sidemenu-container .sidemenu>li.heading>h3, +.green-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.heading>h3{ + color: #fff; +} +.green-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow { + border-right: 8px solid #fff; +} + + +/* Red sidebar color */ +.red-sidebar-color .sidemenu-container { + background-color: #E44F56 +} +.red-sidebar-color .sidemenu-container .sidemenu>li.active.open>a, +.red-sidebar-color .sidemenu-container .sidemenu>li.active>a, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + background-color: #b54b50; + border-top-color: transparent; + color: #fff; +} +.red-sidebar-color .sidemenu-container .sidemenu>li>a, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a{ + color: rgba(255, 255, 255, 0.8); + border-bottom:none; +} +.red-sidebar-color .user-panel{ + color: #fff; +} +.red-sidebar-color .txtOnline{ + color: #fff; +} +.red-sidebar-color .sidemenu-container .sidemenu>li.open>a, +.red-sidebar-color .sidemenu-container .sidemenu>li:hover>a, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a { + background-color: #E44F56; + color: #fff; +} +.red-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow.open:before, +.red-sidebar-color .sidemenu-container .sidemenu>li.open>a>.arrow:before, +.red-sidebar-color .sidemenu-container .sidemenu>li.open>a>i, +.red-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow.open:before, +.red-sidebar-color .sidemenu-container .sidemenu>li:hover>a>.arrow:before, +.red-sidebar-color .sidemenu-container .sidemenu>li:hover>a>i, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow.open:before, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow:before, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>i, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow.open:before, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow:before, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>i{ + color: #fff; +} +.red-sidebar-color .sidemenu-container .sidemenu .sub-menu, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu{ + background-color: #b54b50; +} +.red-sidebar-color .sidemenu-container .sidemenu .sub-menu>li>a, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a{ + color: rgba(255, 255, 255, 0.8); +} +.red-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.active>a, +.red-sidebar-color .sidemenu-container .sidemenu .sub-menu>li.open>a, +.red-sidebar-color .sidemenu-container .sidemenu .sub-menu>li:hover>a, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a{ + color: #fff; +} +.red-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow.open:before, +.red-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>.arrow:before, +.red-sidebar-color .sidemenu-container .sidemenu>li.active.open>a>i, +.red-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow.open:before, +.red-sidebar-color .sidemenu-container .sidemenu>li.active>a>.arrow:before, +.red-sidebar-color .sidemenu-container .sidemenu>li.active>a>i, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow.open:before, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow:before, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>i, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow.open:before, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow:before, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>i{ + color: #fff; +} +.red-sidebar-color .page-container{ + background-color : #E44F56 +} +.red-sidebar-color .sidemenu-container .sidemenu>li.heading>h3, +.red-sidebar-color .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.heading>h3{ + color: #fff; +} +.red-sidebar-color .sidemenu-hover-submenu li:hover a>.arrow { + border-right: 8px solid #fff; +} + +/***************** Logo Theme **********************/ +.logo-white .page-header.navbar .page-logo{ + background: #ffffff; +} +.logo-white .page-logo a{ + color: #000; + +} +.logo-dark .page-header.navbar .page-logo{ + background: #222c3c; +} +.logo-blue .page-header.navbar .page-logo{ + background: #1880c9; +} +.logo-indigo .page-header.navbar .page-logo{ + background: #6673FC; +} +.logo-cyan .page-header.navbar .page-logo{ + background: #4ABAD2; +} +.logo-red .page-header.navbar .page-logo{ + background: #E44F56 +} +.logo-green .page-header.navbar .page-logo{ + background: #3FCC7E; +} + + + +/*************** Header Theme ******************/ +/* Header White */ +.header-white .page-header.navbar{ + background-color: #ffffff; +} +.header-white form.search-form-opened { + float: left; + width: 100%; + max-width: 200px; + background-color: transparent; + color: #fff; + border-radius: 30px; + margin: 10px 0 0 10px; + border: 1px solid #bdbdbd; +} +.header-white .page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>.langname, +.header-white .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>.username, +.header-white .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>i{ + color: #000; +} +.header-white .page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle>i{ + color: #000; +} +.header-white .language-switch a{ + color: #000; +} +.header-white .menu-toggler i.icon-menu{ + color: #000000; + font-size: 18px; +} + +.header-white .page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>h3, +.header-white .page-header.navbar .hor-menu .navbar-nav>li>a { + color: #555; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li>a>i { + color: #555; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li.open>a, +.header-white .page-header.navbar .hor-menu .navbar-nav>li:hover>a, +.header-white .page-header.navbar .hor-menu .navbar-nav>li>a:hover { + color: #555; + background: none !important; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li.open>a>i, +.header-white .page-header.navbar .hor-menu .navbar-nav>li:hover>a>i, +.header-white .page-header.navbar .hor-menu .navbar-nav>li>a:hover>i { + color: #555; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li.active>a, +.header-white .page-header.navbar .hor-menu .navbar-nav>li.current>a { + color: #4680ff; + background-color: transparent; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li.active>a>i, +.header-white .page-header.navbar .hor-menu .navbar-nav>li.current>a>i { + color: #4680ff; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a, +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a>i{ + color: #444; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu { + box-shadow: 5px 5px rgba(63, 79, 98, .2); + background: #ffffff; +} +/* .header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a, +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a>i { + color: #444 !important; +} */ +.header-white .page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>a:hover{ + text-decoration: none; + color: #46a2ff; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li:hover>a { + color: #000000; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a, +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a:hover, +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a, +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a:hover { + color: #46a2ff; + background: transparent; +} +.header-white #headerSettingButton { + color: #555 ; +} +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a:hover>i, +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a>i, +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a:hover>i, +.header-white .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a>i, +.header-white .page-header.navbar .hor-menu .navbar-nav>li .active >a:after { + color: #4680ff; +} +/* Header Dark */ +.header-dark .page-header.navbar{ + background-color: #222c3c; +} +.header-dark form.search-form-opened .btn.submit { + color: #fff; +} +.header-dark .search-form-opened input[type="text"]{ + color:#fff; +} +.header-dark form.search-form-opened { + background-color: rgba(255, 255, 255, 0.3); + border: 0; +} +.header-dark .page-header .search-form-opened .input-group .form-control::-moz-placeholder { + color: #efefef; + opacity: 1; +} +.header-dark .page-header .search-form-opened .input-group .form-control:-ms-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-dark .page-header .search-form-opened .input-group .form-control::-webkit-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-dark .page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>.langname, +.header-dark .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>.username, +.header-dark .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>i{ + color: #fff; +} +.header-dark .page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle>i{ + color: #fff; +} +.header-dark .language-switch a{ + color: #fff; +} +.header-dark .menu-toggler i.icon-menu{ + color: #ffffff; + font-size: 18px; +} +.header-dark .page-header.navbar .hor-menu .navbar-nav>li.active>a, +.header-dark .page-header.navbar .hor-menu .navbar-nav>li.current>a{ + background-color: transparent; +} +.header-dark .dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover{ + background-color: transparent; +} +.header-dark .dropdown-menu>li.active:hover>a, +.header-dark .dropdown-menu>li.active>a, +.header-dark .dropdown-menu>li:hover>a{ + background-color: transparent; +} + +.header-dark .language-switch a.dropdown-toggle{ + color:#fff; +} +.header-dark .navbar-custom { + background: #343d4c; +} + +/* header blue */ +.header-blue .page-header.navbar{ + background-color: #1880c9; +} +.header-blue form.search-form-opened .btn.submit { + color: #fff; +} +.header-blue .search-form-opened input[type="text"]{ + color:#fff; +} +.header-blue form.search-form-opened { + background-color: rgba(255, 255, 255, 0.3); + border: 0; +} +.header-blue .page-header .search-form-opened .input-group .form-control::-moz-placeholder { + color: #efefef; + opacity: 1; +} +.header-blue .page-header .search-form-opened .input-group .form-control:-ms-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-blue .page-header .search-form-opened .input-group .form-control::-webkit-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-blue .page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>.langname, +.header-blue .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>.username, +.header-blue .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>i{ + color: #fff; +} +.header-blue .page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle>i{ + color: #fff; +} +.header-blue .language-switch a{ + color: #fff; +} +.header-blue .menu-toggler i.icon-menu{ + color: #ffffff; + font-size: 18px; +} + +.header-blue .page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>h3, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li>a { + color: rgba(255, 255, 255, 0.8); +} +.header-blue .page-header.navbar .hor-menu .navbar-nav>li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-blue .page-header.navbar .hor-menu .navbar-nav>li.open>a, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li:hover>a, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li>a:hover { + color: #fff; + background: none !important; +} +.header-blue .page-header.navbar .hor-menu .navbar-nav>li.open>a>i, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li:hover>a>i, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li>a:hover>i { + color: #fff; +} +.header-blue .page-header.navbar .hor-menu .navbar-nav>li.active>a, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li.current>a { + color: #fff; + background: none !important; +} +.header-blue .page-header.navbar .hor-menu .navbar-nav>li.active>a>i, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li.current>a>i { + color: #fff; +} +.header-blue .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu { + box-shadow: 5px 5px rgba(63, 79, 98, .2); + background: #186fad; +} +.header-blue .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-blue .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li:hover>a { + color: #fff; + /* background: #47596e; */ +} +.header-blue .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a:hover, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a, +.header-blue .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a:hover { + color: #fff; + background: transparent; +} +.header-blue .dropdown-menu>li.active:hover>a, +.header-blue .dropdown-menu>li.active>a, +.header-blue .dropdown-menu>li:hover>a{ + background-color: transparent; +} +.header-blue .language-switch a.dropdown-toggle{ + color:#fff; +} +.header-blue .navbar-custom { + background: #1370b1; +} + +/* Header Indigo */ +.header-indigo .page-header.navbar{ + background-color: #6673FC; +} +.header-indigo form.search-form-opened .btn.submit { + color: #fff; +} +.header-indigo .search-form-opened input[type="text"]{ + color:#fff; +} +.header-indigo form.search-form-opened { + background-color: rgba(255, 255, 255, 0.3); + border: 0; +} +.header-indigo .page-header .search-form-opened .input-group .form-control::-moz-placeholder { + color: #efefef; + opacity: 1; +} +.header-indigo .page-header .search-form-opened .input-group .form-control:-ms-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-indigo .page-header .search-form-opened .input-group .form-control::-webkit-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-indigo .page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>.langname, +.header-indigo .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>.username, +.header-indigo .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>i{ + color: #fff; +} +.header-indigo .page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle>i{ + color: #fff; +} +.header-indigo .language-switch a{ + color: #fff; +} +.header-indigo .menu-toggler i.icon-menu{ + color: #ffffff; + font-size: 18px; +} + +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>h3, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li>a { + color: rgba(255, 255, 255, 0.8); +} +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li.open>a, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li:hover>a, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li>a:hover { + color: #fff; + background: none !important; +} +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li.open>a>i, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li:hover>a>i, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li>a:hover>i { + color: #fff; +} +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li.active>a, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li.current>a { + color: #fff; + background: none !important; +} +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li.active>a>i, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li.current>a>i { + color: #fff; +} +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu { + box-shadow: 5px 5px rgba(63, 79, 98, .2); + background: #545ed6; +} +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li:hover>a { + color: #fff; + /* background: #47596e; */ +} +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a:hover, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a, +.header-indigo .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a:hover { + color: #fff; + background: transparent; +} +.header-indigo .dropdown-menu>li.active:hover>a, +.header-indigo .dropdown-menu>li.active>a, +.header-indigo .dropdown-menu>li:hover>a{ + background-color: transparent; +} +.header-indigo .language-switch a.dropdown-toggle{ + color:#fff; +} +.header-indigo .navbar-custom { + background: #5360e6; +} + +/* Header Cyan */ +.header-cyan .page-header.navbar{ + background-color: #4ABAD2; +} +.header-cyan form.search-form-opened .btn.submit { + color: #fff; +} +.header-cyan .search-form-opened input[type="text"]{ + color:#fff; +} +.header-cyan form.search-form-opened { + background-color: rgba(255, 255, 255, 0.3); + border: 0; +} +.header-cyan .page-header .search-form-opened .input-group .form-control::-moz-placeholder { + color: #efefef; + opacity: 1; +} +.header-cyan .page-header .search-form-opened .input-group .form-control:-ms-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-cyan .page-header .search-form-opened .input-group .form-control::-webkit-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-cyan .page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>.langname, +.header-cyan .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>.username, +.header-cyan .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>i{ + color: #fff; +} +.header-cyan .page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle>i{ + color: #fff; +} +.header-cyan .language-switch a{ + color: #fff; +} +.header-cyan .menu-toggler i.icon-menu{ + color: #ffffff; + font-size: 18px; +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>h3, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li>a { + color: rgba(255, 255, 255, 0.8); +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li.open>a, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li:hover>a, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li>a:hover { + color: #fff; + background: none !important; +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li.open>a>i, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li:hover>a>i, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li>a:hover>i { + color: #fff; +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li.active>a, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li.current>a { + color: #fff; + background: none !important; +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li.active>a>i, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li.current>a>i { + color: #fff; +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu { + box-shadow: 5px 5px rgba(63, 79, 98, .2); + background: #34A3BC; +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li:hover>a { + color: #fff; + /* background: #47596e; */ +} +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a:hover, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a, +.header-cyan .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a:hover { + color: #fff; + background: transparent; +} +.header-cyan .dropdown-menu>li.active:hover>a, +.header-cyan .dropdown-menu>li.active>a, +.header-cyan .dropdown-menu>li:hover>a{ + background-color: transparent; +} +.header-cyan .language-switch a.dropdown-toggle{ + color:#fff; +} +.header-cyan .navbar-custom { + background: #44a8bd; +} + +/* Header Red */ +.header-red .page-header.navbar{ + background-color: #E44F56 +} +.header-red form.search-form-opened .btn.submit { + color: #fff; +} +.header-red .search-form-opened input[type="text"]{ + color:#fff; +} +.header-red form.search-form-opened { + background-color: rgba(255, 255, 255, 0.3); + border: 0; +} +.header-red .page-header .search-form-opened .input-group .form-control::-moz-placeholder { + color: #efefef; + opacity: 1; +} +.header-red .page-header .search-form-opened .input-group .form-control:-ms-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-red .page-header .search-form-opened .input-group .form-control::-webkit-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-red .page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>.langname, +.header-red .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>.username, +.header-red .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>i{ + color: #fff; +} +.header-red .page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle>i{ + color: #fff; +} +.header-red .language-switch a{ + color: #fff; +} +.header-red .menu-toggler i.icon-menu{ + color: #ffffff; + font-size: 18px; +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>h3, +.header-red .page-header.navbar .hor-menu .navbar-nav>li>a { + color: rgba(255, 255, 255, 0.8); +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li.open>a, +.header-red .page-header.navbar .hor-menu .navbar-nav>li:hover>a, +.header-red .page-header.navbar .hor-menu .navbar-nav>li>a:hover { + color: #fff; + background: none !important; +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li.open>a>i, +.header-red .page-header.navbar .hor-menu .navbar-nav>li:hover>a>i, +.header-red .page-header.navbar .hor-menu .navbar-nav>li>a:hover>i { + color: #fff; +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li.active>a, +.header-red .page-header.navbar .hor-menu .navbar-nav>li.current>a { + color: #fff; + background: none !important; +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li.active>a>i, +.header-red .page-header.navbar .hor-menu .navbar-nav>li.current>a>i { + color: #fff; +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu { + box-shadow: 5px 5px rgba(63, 79, 98, .2); + background: #b54b50; +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a, +.header-red .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li:hover>a { + color: #fff; + /* background: #47596e; */ +} +.header-red .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a, +.header-red .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a:hover, +.header-red .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a, +.header-red .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a:hover { + color: #fff; + background: transparent; +} +.header-red .dropdown-menu>li.active:hover>a, +.header-red .dropdown-menu>li.active>a, +.header-red .dropdown-menu>li:hover>a{ + background-color: transparent; +} +.header-red .language-switch a.dropdown-toggle{ + color:#fff; +} +.header-red .navbar-custom { + background: #ce444b; +} + +/* Header Green */ +.header-green .page-header.navbar{ + background-color: #3FCC7E; +} +.header-green form.search-form-opened .btn.submit { + color: #fff; +} +.header-green .search-form-opened input[type="text"]{ + color:#fff; +} +.header-green form.search-form-opened { + background-color: rgba(255, 255, 255, 0.3); + border: 0; +} +.header-green .page-header .search-form-opened .input-group .form-control::-moz-placeholder { + color: #efefef; + opacity: 1; +} +.header-green .page-header .search-form-opened .input-group .form-control:-ms-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-green .page-header .search-form-opened .input-group .form-control::-webkit-input-placeholder { + color: #efefef; + opacity: 1; +} +.header-green .page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>.langname, +.header-green .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>.username, +.header-green .page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>i{ + color: #fff; +} +.header-green .page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle>i{ + color: #fff; +} +.header-green .language-switch a{ + color: #fff; +} +.header-green .menu-toggler i.icon-menu{ + color: #ffffff; + font-size: 18px; +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>h3, +.header-green .page-header.navbar .hor-menu .navbar-nav>li>a { + color: rgba(255, 255, 255, 0.8); +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li.open>a, +.header-green .page-header.navbar .hor-menu .navbar-nav>li:hover>a, +.header-green .page-header.navbar .hor-menu .navbar-nav>li>a:hover { + color: #fff; + background: none !important; +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li.open>a>i, +.header-green .page-header.navbar .hor-menu .navbar-nav>li:hover>a>i, +.header-green .page-header.navbar .hor-menu .navbar-nav>li>a:hover>i { + color: #fff; +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li.active>a, +.header-green .page-header.navbar .hor-menu .navbar-nav>li.current>a { + color: #fff; + background: none !important; +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li.active>a>i, +.header-green .page-header.navbar .hor-menu .navbar-nav>li.current>a>i { + color: #fff; +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu { + box-shadow: 5px 5px rgba(63, 79, 98, .2); + background: #3fa961; +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a, +.header-green .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a>i { + color: rgba(255, 255, 255, 0.8); +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li:hover>a { + color: #fff; + /* background: #47596e; */ +} +.header-green .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a, +.header-green .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a:hover, +.header-green .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a, +.header-green .page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a:hover { + color: #fff; + background: transparent; +} +.header-green .dropdown-menu>li.active:hover>a, +.header-green .dropdown-menu>li.active>a, +.header-green .dropdown-menu>li:hover>a{ + background-color: transparent; +} +.header-green .language-switch a.dropdown-toggle{ + color:#fff; +} +.header-green .navbar-custom { + background: #33b76e; +} \ No newline at end of file diff --git a/bassets/admin/css/theme_style.css b/bassets/admin/css/theme_style.css new file mode 100644 index 0000000..5fe956c --- /dev/null +++ b/bassets/admin/css/theme_style.css @@ -0,0 +1,7368 @@ +@charset "UTF-8"; +/* + * Document : theme_style.css + * Author : RedStar Theme + * Description: The main theme stylesheet of the template + * + * Structure (with shortcodes): + + 1. GLOBLE STYLE + 2. BODY + 3. HEADER + 4. SIDE MENU + 5. SEARCH BAR + 6. NAVIGATION + 7. PANEL + 8. PAGE CONTENT + 9. FORM + 10. USER PANEL STYLE + 11. MODAL WINDOW + 12. CHAT PANEL + 13. CARD BOX STYLE + 14. PROFILE + 15. WIZARD + 16. TABLE + 17. BUTTON + 18. LABEL + 19. CALENDAR + 20. DROP DOWN STYLE + 21. CHECKBOX & RADIO + 22. ICON BUTTON + 23. VALIDATION ICONS + 24. NOTE + 25. PAGINATION + 26. ACCORDION + 27. TAB + 28. STATE OVERVIEW + 29. BORDER BOX + 30. RATING BUTTON + 31. TO DO LIST + 32. BADGE + 33. SCROLL TO TOP + 34. FOOTER + 35. MODALS + */ +/*********************************************************************** + + [1. GLOBLE STYLE ] + +***********************************************************************/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: Roboto,sans-serif; + font-weight: 300; +} +h1 { + font-size: 36px !important; +} +h2 { + font-size: 30px !important; +} +h3 { + font-size: 23px !important; +} +h4 { + font-size: 18px !important; +} +h5 { + font-size: 14px !important; +} +h6 { + font-size: 13px !important; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + color: #444 +} +h1.block, +h2.block, +h3.block, +h4.block, +h5.block, +h6.block { + padding-top: 10px; + padding-bottom: 10px +} +.h4, .h5, .h6, h4, h5, h6 { + margin-top: 10px; + margin-bottom: 10px; +} +.alert, +.badge, +.btn-group>.btn, +.btn.btn-link:hover, +.btn, +.icon-btn, +.label, +.note, +.panel, +.overview-panel { + box-shadow: 0 1px 3px rgba(0, 0, 0, .1), 0 1px 2px rgba(0, 0, 0, .18) +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.badge, +.input-inline { + vertical-align: middle +} +hr{ + margin: 20px 0 +} +a { + text-shadow: none; + color: #337ab7; +} +a:hover { + cursor: pointer; + color: #23527c +} +a:active, +a:focus, +a:hover { + outline: 0; + text-decoration: none; +} +hr { + border: 0; + border-top: 1px solid #eee; + border-bottom: 0 +} +code { + border: 1px solid #e1e1e1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, .1); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, .1); + box-shadow: 0 1px 4px rgba(0, 0, 0, .1) +} +.bold { + font-weight: 700!important +} +.sbold { + font-weight: 600!important +} +.thin { + font-weight: 500!important +} +.uppercase { + text-transform: uppercase!important +} +.border { + border: 1px solid red +} +.inline { + display: inline +} +.inline-block { + display: inline-block +} +.circle { + border-radius: 25px!important +} +.circle-right { + border-radius: 0 25px 25px 0!important +} +.circle-left { + border-radius: 25px 0 0 25px!important +} +.circle-bottom { + border-radius: 0 0 25px 25px!important +} +.circle-top { + border-radius: 25px 25px 0 0!important +} +.rounded { + border-radius: 50%!important +} +.display-hide, +.display-none { + display: none +} +.hidden { + display: none!important +} +.no-margin { + margin: 0 +} +.mg-bottom-10 { + margin-bottom: 10px !important +} +.margin-top-20 { + margin-top: 20px!important +} +.margin-right-10 { + margin-right: 10px!important +} +.visible-ie8 { + display: none +} +.ie8 .visible-ie8 { + display: inherit!important +} +.visible-ie9 { + display: none +} +.ie9 .visible-ie9 { + display: inherit!important +} +.hidden-ie8 { + display: inherit +} +.ie8 .hidden-ie8 { + display: none!important +} +.hidden-ie9 { + display: inherit +} +.ie9 .hidden-ie9 { + display: none!important +} +.m-b-10 { + margin-bottom: 10px !important; +} +.p-t-20{ + padding-top: 20px !important; +} +.p-r-20{ + padding-right: 20px !important; +} +.p-b-20{ + padding-bottom: 20px !important; +} +.p-l-20{ + padding-left: 20px !important; +} +.p-r-100{ + padding-right: 100px !important; +} +.m-r-20{ + margin-right: 20px !important; +} +.m-b-20{ + margin-bottom: 20px !important; +} +.m-t-20{ + margin-top: 20px !important; +} +.m-l-20{ + margin-left: 20px !important; +} +.m-r-100{ + margin-right: 100px !important; +} +.margin-0 { + margin: 0!important; +} +.input-small { + width: 145px!important +} +.input-inline { + width: auto +} +.font-bold { + font-weight: bold; +} +.label-rouded { + border-radius: 50px; +} +.text-center{ + text-align: center; +} +/******* Colors Codes********/ + +.text-purple { + color: #9675ce; +} +.text-white { + color: #ffffff; +} +.text-success { + color: #36c6d3 +} +.text-info { + color: #659be0 +} +.text-warning { + color: #F1C40F +} +.text-danger { + color: #ed6b75 +} +.headerBadgeColor1{ + background-color: #C46210 ; +} +.headerBadgeColor2{ + background-color: #673ab7 ; +} +.orange-bgcolor { + background-color: #C46210 !important; +} +.purple-bgcolor, +.label.purple-bgcolor { + background-color: #673ab7; +} +.blue-bgcolor, +.btn.blue-bgcolor { + background-color: #2196F3; + color: #fff; +} +.cyan-bgcolor { + background-color: #36C6D3; + color: #fff; +} +.deepPink-bgcolor, +.label.deepPink-bgcolor { + background-color: #e91e63 !important; + color: #fff !important; +} +.bg-warning{ + color: #fff; + background-color: #ffd200; +} +.bg-success { + background: #5FC29D; + color: #fff; +} + +.bg-orange { + background: #E67D21; + color: #fff; +} + +.bg-blue { + background: #3598dc; + color: #fff; +} + +.bg-purple { + background: #8E44AD; + color: #fff; +} + +.red { + color: #fff; + background-color: #F44336; +} +.pink { + background-color: #FF1493; + color: #fff; +} +.yellow { + background-color: #f1c500; + color: #fff; +} +.state-overview { + color: #fff; +} +.overview-panel { + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.badge, +.btn { + font-weight: 600; + text-transform: uppercase +} +.list-separated { + margin-top: 10px; + margin-bottom: 15px +} +.list-separated>div:last-child { + border-right: 0 +} +/****** Fontawasome style *********/ + +[class*=" fa-"]:not(.fa-stack), +[class*=" glyphicon-"], +[class*=" icon-"], +[class^=fa-]:not(.fa-stack), +[class^=glyphicon-], +[class^=icon-] { + display: inline-block; + line-height: 14px; + -webkit-font-smoothing: antialiased; + text-decoration: none; +} +li [class*=" fa-"], +li [class*=" glyphicon-"], +li [class*=" icon-"], +li [class^=fa-], +li [class^=glyphicon-], +li [class^=icon-] { + display: inline-block; + width: 1.25em; + text-align: center +} +li [class*=" glyphicon-"], +li [class^=glyphicon-] { + top: 2px +} +li [class*=" icon-"], +li [class^=icon-] { + top: 1px; + position: relative +} +li [class*=" fa-"].icon-large, +li [class*=" glyphicon-"].icon-large, +li [class*=" icon-"].icon-large, +li [class^=fa-].icon-large, +li [class^=glyphicon-].icon-large, +li [class^=icon-].icon-large { + width: 1.5625em +} +.fa-item { + font-size: 14px; + padding: 15px 10px 15px 20px +} +.fa-item i { + font-size: 16px; + display: inline-block; + width: 20px; + color: #333 +} +.fa-item:hover { + cursor: pointer; + background: #eee +} +/********* Simple line icon style ***************/ + +.sl-iconsdemo .item-box { + display: inline-block; + font-size: 16px; + margin: 0 -.22em 1em 0; + padding-left: 1em; + width: 100% +} +.sl-iconsdemo .item-box .item { + background-color: #fff; + color: #33383e; + border-radius: 8px; + display: inline-block; + padding: 10px; + width: 100% +} +.sl-iconsdemo .item-box .item span { + font-size: 22px +} +.badge-danger, +.badge-default, +.badge-info, +.badge-primary, +.badge-success, +.badge-warning, +.btn.white:not(.btn-outline).active, +.btn.white:not(.btn-outline):active, +.open>.btn.white:not(.btn-outline).dropdown-toggle { + background-image: none +} +.alert>p { + margin: 0 +} +.alert.alert-borderless { + border: 0 +} +.alert { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + border-width: 0 +} +.margin-top-10 { + margin-top: 10px; +} +.full-width { + float: left; + width: 100%; +} +.hide{ + display: none!important; +} +.img-circle { + border-radius: 50%; +} +.pull-right { + float: right!important; +} +/****************************************************************************************** + + [ 2. BODY ] + +*******************************************************************************************/ + +body { + background-color:#eef1f5; + padding: 0!important; + margin: 0!important; + font-family: Roboto,sans-serif; + font-size: 15px; + font-weight: 400; + line-height: 1.7; + color: rgba(0,0,0,.87); +} +/* *********************************************************************** + + [ 3. PAGE HEADER ] + +**************************************************************************/ +.navbar-fixed-top { + position: fixed; + right: 0px; + left: 0px; + top: 0px; +} +.page-header.navbar { + background: #193650; +} +.page-header.navbar .page-logo { + float: left; + display: block; + width: 235px; + height: 60px; + padding: 10px 20px 0px 30px; + background: #222c3c; +} +.logo-icon{ + font-size: 35px !important; + padding-right: 5px; +} +.fa-rotate-45 { + -webkit-transform: rotate(330deg) !important; + -moz-transform: rotate(330deg) !important; + -ms-transform: rotate(330deg) !important; + -o-transform: rotate(330eg) !important; + transform: rotate(330deg) !important; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle>i { + color: #1E2629; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle .badge.badge-default { + background-color: #3881b3; + color: #fff; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle:hover, +.page-header.navbar .top-menu .navbar-nav>li.dropdown.open .dropdown-toggle { + background-color: rgba(0, 0, 0, 0); +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-toggle:hover>i, +.page-header.navbar .top-menu .navbar-nav>li.dropdown.open .dropdown-toggle>i { + color: #8c8c8c; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu { + border-color: #e7eaf0; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu:after { + border-bottom-color: #eaedf2; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu>li.external { + background: #EFF0F4; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu>li.external>h3 { + color: #555; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu>li.external>a { + color: #337ab7; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu>li.external>a:hover { + color: #23527c; + text-decoration: none; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu .dropdown-menu-list>li>a { + border-bottom: 1px solid #EFF2F6!important; + color: #888; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu .dropdown-menu-list>li>a:hover { + background: #f8f9fa; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu .dropdown-menu-list>li>a .time { + background: #f1f1f1; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu .dropdown-menu-list>li>a:hover .time { + background: #e4e4e4; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox>.dropdown-toggle>.circle { + background-color: #3881b3; + color: #fff; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox>.dropdown-toggle>.corner { + border-color: transparent transparent transparent #3881b3; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox .dropdown-menu .dropdown-menu-list .subject .from { + color: #5b9bd1; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>.langname, +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>.username, +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-toggle>i { + color: #1E2629; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-tasks .dropdown-menu .dropdown-menu-list .progress { + background-color: #dfe2e9; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user>.dropdown-menu { + width: 195px; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu { + background: #3f4f62; + border: 0; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu:after { + border-bottom-color: #3f4f62; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu>li.external { + background: #2f3b49; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu>li.external>h3 { + color: #adbaca; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu>li.external>a:hover { + color: #5496cf; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu .dropdown-menu-list>li a, +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu.dropdown-menu-default>li a { + color: #bcc7d4; + border-bottom: 1px solid #4b5e75!important; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu .dropdown-menu-list>li a>i, +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu.dropdown-menu-default>li a>i { + color: #9dadc0; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu .dropdown-menu-list>li a:hover, +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu.dropdown-menu-default>li a:hover { + background: #47596e; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu.dropdown-menu-default>li a { + border-bottom: 0!important; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-dark .dropdown-menu.dropdown-menu-default>li.divider { + background: #4b5e75; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-notification.dropdown-dark .dropdown-menu .dropdown-menu-list>li>a .time { + background: #354353; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-notification.dropdown-dark .dropdown-menu .dropdown-menu-list>li>a:hover .time { + background: #2b3643; +} +.dropdown-quick-sidebar-toggler a { + padding: 0px !important; + top: 10px; +} +.page-header.navbar .search-form { + background: transparent; + border: 0; + color: #B4BCC8; +} +.page-header.navbar input.search-form:focus { + outline: 0; +} +.page-header.navbar .search-form.open, +.page-header.navbar .search-form:hover { + background: transparent; +} +.page-header.navbar .search-form .input-group .form-control { + color: #959fad; +} +.page-header.navbar .search-form .input-group .form-control::-moz-placeholder { + color: #929cab; + opacity: 1; +} +.page-header.navbar .search-form .input-group .form-control:-ms-input-placeholder { + color: #929cab; +} +.page-header.navbar .search-form .input-group .form-control::-webkit-input-placeholder { + color: #929cab; +} +.page-header.navbar .search-form .input-group .input-group-btn .btn.submit>i { + color: #ffffff; +} +.page-header.navbar .menu-toggler>span, +.page-header.navbar .menu-toggler>span:after, +.page-header.navbar .menu-toggler>span:before, +.page-header.navbar .menu-toggler>span:hover, +.page-header.navbar .menu-toggler>span:hover:after, +.page-header.navbar .menu-toggler>span:hover:before { + background: #a7b5c6; +} +.page-header.navbar .menu-toggler.th-toggle-exit>span { + background-color: transparent!important; +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu { + box-shadow: 5px 5px rgba(63, 79, 98, .2); +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>h3, +.page-header.navbar .hor-menu .navbar-nav>li>a { + color: #c6cfda; +} +.page-header.navbar .hor-menu .navbar-nav>li>a>i { + color: #c2cad8; + padding-right: 3px; +} +.page-header.navbar .hor-menu .navbar-nav>li.open>a, +.page-header.navbar .hor-menu .navbar-nav>li:hover>a, +.page-header.navbar .hor-menu .navbar-nav>li>a:hover { + color: #d5dce4; + background: #3f4f62!important; +} +.page-header.navbar .hor-menu .navbar-nav>li.open>a>i, +.page-header.navbar .hor-menu .navbar-nav>li:hover>a>i, +.page-header.navbar .hor-menu .navbar-nav>li>a:hover>i { + color: #889bb2; +} +.page-header.navbar .hor-menu .navbar-nav>li.active>a, +.page-header.navbar .hor-menu .navbar-nav>li.current>a { + color: #fff; + background: #3881b3; +} +.page-header.navbar .hor-menu .navbar-nav>li.active>a>i, +.page-header.navbar .hor-menu .navbar-nav>li.current>a>i { + color: #c2cad8; +} +.page-header.navbar .hor-menu .navbar-nav>li.active .selected, +.page-header.navbar .hor-menu .navbar-nav>li.current .selected { + border-top: 6px solid #3881b3; +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu { + box-shadow: 5px 5px rgba(63, 79, 98, .2); + background: #3f4f62; +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a, +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a>i { + color: #c6cfda; +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li:hover>a { + color: #f1f3f6; +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li:hover>a>i { + color: #f1f3f6; +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a, +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a:hover, +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a, +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a:hover { + color: #f1f3f6; + background: #47596e; +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a:hover>i, +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.active>a>i, +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a:hover>i, +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.current>a>i { + color: #f1f3f6; +} +.page-header-inner { + float: left; + width: 100%; +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li.divider { + background-color: #495c72; +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-submenu>a:after { + color: #c6cfda; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.mega-menu-dropdown>.dropdown-menu { + box-shadow: 5px 5px rgba(102, 102, 102, .1); +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>h3 { + color: #666; +} +.mega-menu-dropdown .owl-controls { + display: none!important; +} +.classic-menu-dropdown .dropdown-menu, .mega-menu-dropdown .dropdown-menu { + right: auto; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li>a { + color: #c6cfda; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li>a>i { + color: #788ea8; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li:hover>a, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li>a:hover { + color: #d5dce4; + background: #3f4f62; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li:hover>a>i, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li>a:hover>i { + color: #889bb2; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.open>a { + color: #333!important; + background: #fff!important; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.open>a>i { + color: #333!important; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.active>a, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.active>a:hover, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.current>a, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.current>a:hover { + color: #fff; + background: #3881b3; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.active>a:hover>i, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.active>a>i, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.current>a:hover>i, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li.current>a>i { + color: #788ea8; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu { + box-shadow: 5px 5px rgba(102, 102, 102, .1); + background: #fff; + border: 1px solid #f2f2f2; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li>a { + color: #000; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li>a>i { + color: #888; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li:hover>a { + color: #000; + background: #f5f5f5; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li:hover>a>i { + color: #666; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li.active>a, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li.active>a:hover, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li.current>a, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li.current>a:hover { + color: #000; + background: #f5f5f5; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li.active>a:hover>i, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li.active>a>i, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li.current>a:hover>i, +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li.current>a>i { + color: #666; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li .dropdown-menu li.divider { + background-color: #f5f5f5; +} +.page-header.navbar .hor-menu.hor-menu-light .navbar-nav>li>.dropdown-menu { + border-top: 0; +} +.page-header.navbar .menu-toggler>span, +.sidemenu-container .sidebar-toggler>span, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span { + outline: 0 !important +} +.page-header.navbar, +.page-header.navbar .top-menu .navbar-nav>li.dropdown-tasks .dropdown-menu .dropdown-menu-list>li .progress .progress-bar { + box-shadow: none +} +.page-header.navbar { + width: 100%; + margin: 0; + border: 0; + padding: 0; + min-height: 50px; + filter: none; + background-color: #fff; + box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16), 0 2px 10px 0 rgba(0,0,0,0.12); +} +.navbar-custom { + background: #f1efef; + float: left; + width: 100%; + text-align: center; + height: 60px; +} +.navbar-nav .dropdown-menu{ + position: absolute; +} +.page-header.navbar.navbar-fixed-top, +.page-header.navbar.navbar-static-top { + z-index: 9995 +} +.sidemenu-closed.sidemenu-closed-hidelogo .page-header.navbar .page-logo { + padding: 0 +} +.page-header.navbar .page-logo>.logo-image, +.page-header.navbar .page-logo>a { + display: inline-block; + float: left +} +.page-header.navbar .page-logo .logo-default { + margin: 7px 0 0; + height: 34px; +} +.page-header.navbar .page-logo .logo-mini { + display: none; + margin-left: 5px +} +.page-header.navbar .page-logo .text-logo { + padding-left: 20px; + padding-top: 12px +} +.page-logo a { + text-decoration: none; + color: #fff; + font-size: 25px; +} +.navbar-nav>li>a, +.navbar-nav>li>a.sidebar-toggler { + padding: 20px 10px 20px 15px; + line-height: 20px; +} +.page-header.navbar .search-form { + display: inline-block; + position: relative; + width: 50px; + float: left; + transition: all .6s; + margin-top: 10px; +} +.page-header.navbar .search-form .input-group .form-control { + height: 50px; + border: 0; + background: 0 0 !important; + font-size: 13px; + padding-left: 0; + margin-left: 12px; + text-indent: -150000px +} +.page-header.navbar .search-form .input-group .form-control:hover { + cursor: pointer +} +.page-header.navbar .search-form .input-group .input-group-btn { + height: 50px +} +.page-header.navbar .search-form .input-group .input-group-btn .btn.submit { + margin-left: -24px; + padding: 0; + width: 50px; + background: 0 0; + margin-top: 4px; + display: block +} +.page-header.navbar .search-form .input-group .input-group-btn .btn.submit>i { + font-size: 15px +} +.page-header.navbar .search-form.open { + transition: all .6s; + width: 200px !important +} +.page-header.navbar .search-form.open .input-group .form-control { + text-indent: 0 +} +.page-header.navbar .search-form.open .input-group .form-control:hover { + cursor: text +} +.page-header.navbar .search-form.open .input-group .input-group-btn .btn.submit { + margin-left: 0 +} +form.search-form-opened { + float: left; + width: 100%; + max-width: 200px; + background-color: transparent; + color: #fff; + border-radius: 30px; + margin: 10px 0 0 10px; + border: 1px solid #bdbdbd; +} +form.search-form-opened .btn.submit { + margin: 0; + color: #1E2629; +} +.search-form-opened .input-group-btn a{ + padding: 12px 12px 7px; +} +.search-form-opened input[type="text"] { + background-color: transparent; + border: 0; + color: #1E2629; + padding: 7px 12px; +} +.page-header.navbar .menu-toggler { + cursor: pointer; + opacity: .7; + filter: alpha(opacity=70); + display: block; + -webkit-transition: opacity .3s; + -moz-transition: opacity .3s; + -ms-transition: opacity .3s; + -o-transition: opacity .3s; + transition: opacity .3s; + background: none; +} +.page-header.navbar .menu-toggler>span:hover, +.page-header.navbar .menu-toggler>span:hover:after, +.page-header.navbar .menu-toggler>span:hover:before { + background: #a7b5c6; +} +.page-header.navbar .menu-toggler>span, +.page-header.navbar .menu-toggler>span:after, +.page-header.navbar .menu-toggler>span:before { + display: inline-block; + width: 19px; + height: 1px; + position: relative; + top: -10px; + transition: all ease .3s +} +.menu-toggler i.icon-menu{ + color: #808040; + font-size: 18px; +} +.page-header.navbar .menu-toggler>span:after, +.page-header.navbar .menu-toggler>span:before { + position: absolute; + left: 0; + content: '' +} +.page-header.navbar .menu-toggler>span:before { + top: 6px +} +.page-header.navbar .menu-toggler>span:after { + top: -6px +} +.page-header.navbar .menu-toggler.th-toggle-exit>span { + background-color: transparent !important +} +.page-header.navbar .menu-toggler.th-toggle-exit>span:after { + -webkit-transform: translateY(6px) rotateZ(45deg); + -moz-transform: translateY(6px) rotateZ(45deg); + -ms-transform: translateY(6px) rotateZ(45deg); + -o-transform: translateY(6px) rotateZ(45deg); + transform: translateY(6px) rotateZ(45deg) +} +.page-header.navbar .menu-toggler.th-toggle-exit>span:before { + -webkit-transform: translateY(-6px) rotateZ(-45deg); + -moz-transform: translateY(-6px) rotateZ(-45deg); + -ms-transform: translateY(-6px) rotateZ(-45deg); + -o-transform: translateY(-6px) rotateZ(-45deg); + transform: translateY(-6px) rotateZ(-45deg) +} +.page-header.navbar .menu-toggler:hover { + -webkit-transition: opacity .3s; + -moz-transition: opacity .3s; + -ms-transition: opacity .3s; + -o-transition: opacity .3s; + transition: opacity .3s; + opacity: 1; + filter: alpha(opacity=100); +} +.page-header.navbar .menu-toggler:focuse{ + background: none; +} +/* .page-header.navbar .menu-toggler.sidebar-toggler { + float: right; + margin: 15.5px 0 0 +} */ +.page-header.navbar .menu-toggler.responsive-toggler { + display: none; + float: right; + margin: 23px 13px 0 +} +.page-header.navbar .top-menu { + margin: 0; + padding: 0; + float: right +} +.page-header.navbar .top-menu .navbar-nav { + padding: 0; + margin-right: 20px; + display: block +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown { + margin: 0; + padding: 5px 8px; + display: inline-block; + float: left; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown:last-child { + padding-right: 0; + padding-left: 3px; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown>.dropdown-toggle { + margin: 0; + padding: 16px 10px 9px 0; + display: block; + position: relative; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown>.dropdown-toggle:last-child { + padding-right: 0 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown>.dropdown-toggle>i { + font-size: 17px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown>.dropdown-toggle>i.glyphicon { + font-size: 16px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown>.dropdown-toggle>.badge { + font-family: Roboto,sans-serif; + position: absolute; + top: 10px; + right: 0px; + font-weight: 300; + padding: 3px 6px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown>.dropdown-toggle:focus { + background: 0 0 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-menu { + margin-top: 3px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-menu:before { + position: absolute; + top: -7px; + right: 9px; + display: inline-block !important; + border-right: 7px solid transparent; + border-bottom: 7px solid #eee; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, .2); + content: '' +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-menu:after { + position: absolute; + top: -6px; + right: 10px; + display: inline-block !important; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: '' +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown .dropdown-menu>li>a { + color: #555; + font-size: 13px; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu { + min-width: 160px; + max-width: 355px; + width: 355px; + z-index: 9995 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu>li.external { + display: block; + overflow: hidden; + padding: 15px; + letter-spacing: .5px; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + -ms-border-radius: 4px 4px 0 0; + -o-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu>li.external>h3 { + margin: 0; + padding: 0; + float: left; + font-size: 13px; + display: inline-block; + font-size: 18px !important; + line-height: 20px; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu>li.external>a { + display: inline-block; + padding: 0; + background: 0 0; + clear: inherit; + font-size: 13px; + font-weight: 300; + position: absolute; + right: 10px; + border: 0; + margin-top: -1px +} +.page-bar:after, +.page-container:after, +.page-footer:after, +.sidemenu-container .sidemenu>li.sidebar-search-wrapper:after, +.sidemenu-container .sidemenu>li.sidebar-toggler-wrapper:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.sidebar-search-wrapper:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.sidebar-toggler-wrapper:after { + clear: both +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu>li.external>a:hover { + text-decoration: none +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu .dropdown-menu-list { + padding-right: 0 !important; + padding-left: 0; + list-style: none; + overflow-y: auto; + height: 260px; + width: auto; +} + +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu .dropdown-menu-list>li>a { + display: block; + clear: both; + font-weight: 300; + line-height: 20px; + white-space: normal; + font-size: 13px; + padding: 8px 15px 8px; + text-shadow: none +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu .dropdown-menu-list>li>a:hover { + opacity: 1; + filter: alpha(opacity=100); + text-decoration: none +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu .dropdown-menu-list>li:first-child a { + border-top: none +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu .dropdown-menu-list>li a .details { + overflow: hidden +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu .dropdown-menu-list>li a .details .label-icon { + margin-right: 10px; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + -ms-border-radius: 50%; + -o-border-radius: 50%; + border-radius: 50% +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu .dropdown-menu-list>li a .details .label-icon i { + margin-right: 2px; + margin-left: 1px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu .dropdown-menu-list>li a .details .label-icon .badge { + right: 15px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-notification .dropdown-menu .dropdown-menu-list>li a .time { + float: right; + max-width: 75px; + font-size: 11px; + font-weight: 400; + opacity: .7; + filter: alpha(opacity=70); + text-align: right; + padding: 1px 5px; + margin: 7px 0px; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox>.dropdown-menu .dropdown-menu-list>li .photo { + float: left; + margin: 0 6px 6px 0 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox>.dropdown-menu .dropdown-menu-list>li .photo img { + height: 40px; + width: 40px; + -webkit-border-radius: 50% !important; + -moz-border-radius: 50% !important; + -ms-border-radius: 50% !important; + -o-border-radius: 50% !important; + border-radius: 50% !important +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox>.dropdown-menu .dropdown-menu-list>li .subject { + display: block; + margin-left: 46px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox>.dropdown-menu .dropdown-menu-list>li .subject .from { + font-size: 13px; + font-weight: 600 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox>.dropdown-menu .dropdown-menu-list>li .subject .time { + font-size: 12px; + font-weight: 400; + opacity: .5; + filter: alpha(opacity=50); + float: right +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-inbox>.dropdown-menu .dropdown-menu-list>li .message { + display: block !important; + font-size: 12px; + line-height: 1.3; + margin-left: 46px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-tasks .dropdown-menu .dropdown-menu-list>li .task { + margin-bottom: 5px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-tasks .dropdown-menu .dropdown-menu-list>li .task .desc { + font-size: 13px; + font-weight: 300 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-tasks .dropdown-menu .dropdown-menu-list>li .task .percent { + float: right; + font-weight: 600; + display: inline-block +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-tasks .dropdown-menu .dropdown-menu-list>li .progress { + display: block; + height: 8px; + margin: 8px 0 2px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-toggle { + padding: 13px 6px 12px 8px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-toggle>.username { + display: inline-block; + font-size: 13px; + font-weight: 300 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-toggle>img { + float: left; + margin-top: -2px; + margin-right: 5px; + height: 29px; + display: inline-block +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-toggle>i { + display: inline-block; + margin: 0; + font-size: 13px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-menu { + width: 175px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-menu>li>a { + font-size: 14px; + font-weight: 300 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-menu>li>a i { + width: 15px; + display: inline-block; + margin-right: 9px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-user .dropdown-menu>li>a .badge { + margin-right: 10px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-language { + padding-left: 0; + padding-right: 0; + margin: 0 +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle { + padding: 16px 3px 13px 7px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>img { + margin-bottom: 2px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-toggle>i { + font-size: 14px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-menu>li>a { + font-size: 13px +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-language>.dropdown-menu>li>a>img { + margin-bottom: 2px; + margin-right: 5px +} +.page-header.navbar .top-menu .navbar-nav li.dropdown-dark .dropdown-menu:before { + border-left: none; + border-right: none +} +.page-header.navbar .top-menu .navbar-nav li.dropdown-dark .dropdown-menu .dropdown-menu-list>li.external a { + background: 0 0 !important; + border: none !important +} +.page-header.navbar .container { + position: relative +} +.page-header.navbar .hor-menu { + margin: 0; + display: inline-block; +} +.page-header.navbar .hor-menu .navbar-nav { + min-height: 50px; + position: static; + display: block; +} +.page-header.navbar .hor-menu .navbar-nav.navbar-right .dropdown-menu { + left: auto; + right: 0 +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown { + position: static +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu { + left: auto; + width: auto; + position: absolute; +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content { + font-family: Roboto,sans-serif; + padding: 15px; + margin: 0 +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content.mega-menu-responsive-content { + padding: 10px 18px 10px 45px +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu { + padding: 0; + margin: 0 +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu:last-child { + border-right: 0 +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li { + margin: 0 !important; + list-style: none +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>h3 { + margin-top: 5px; + padding-left: 6px; + font-size: 15px; + font-weight: 400 +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>a { + display: block; + white-space: normal; + font-family: Roboto,sans-serif; + padding: 7px; + margin: 0; + font-size: 14px; + font-weight: 300 +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>a:hover { + text-decoration: none +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>a.iconify { + padding: 7px 7px 7px 30px +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>a.iconify>i { + position: absolute; + top: auto !important; + margin-left: -24px; + font-size: 15px; + margin-top: 3px !important +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>a .badge, +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown>.dropdown-menu .mega-menu-content .mega-menu-submenu li>a .label { + margin-left: 5px +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown.mega-menu-full .dropdown-menu { + left: 20px; + right: 20px +} +.page-header.navbar .hor-menu .navbar-nav>li.mega-menu-dropdown:hover>.dropdown-menu { + display: block +} +.page-header.navbar .hor-menu .navbar-nav>li.menu-dropdown .dropdown-menu:after, +.page-header.navbar .hor-menu .navbar-nav>li.menu-dropdown .dropdown-menu:before { + display: none !important +} +.page-header.navbar .hor-menu .navbar-nav>li>a { + font-size: 14px; + font-weight: 400; + padding: 19px 13px 18px 13px; + min-height: 60px; + float: left; +} +.page-header.navbar .hor-menu .navbar-nav>li>a:focus { + background: 0 0 !important +} +.page-header.navbar .hor-menu .navbar-nav>li.active .selected, +.page-header.navbar .hor-menu .navbar-nav>li.current .selected { + left: 50%; + bottom: 0; + position: absolute; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid transparent; + display: inline-block; + margin: 0 0 -6px -7px; + width: 0; + height: 0 +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu { + margin-top: 0; + border: none +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a { + font-family: Roboto,sans-serif; + font-size: 14px; + font-weight: 300; + padding: 9px 10px; + white-space: normal +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a .badge, +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-menu li>a .label { + font-weight: 300 +} +.page-header.navbar .hor-menu .navbar-nav>li.classic-menu-dropdown .dropdown-menu { + min-width: 195px; + max-width: 235px +} +.page-header.navbar .hor-menu .navbar-nav>li.classic-menu-dropdown:hover>.dropdown-menu { + display: block +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-submenu>.dropdown-menu { + top: 0 +} +.page-header.navbar .hor-menu .navbar-nav>li .dropdown-submenu>a:after { + top: 9px; + right: 10px +} +.page-container { + margin: 0; + padding: 0; + position: relative; + background-color: #222c3c; +} +.page-container:after, +.page-container:before { + content: " "; + display: table +} +.page-header-fixed .page-container { + margin-top: 50px +} +.page-full-width.page-header-fixed .page-container { + margin-top: 110px +} +.page-header .top-menu .dropdown-quick-sidebar-toggler>.dropdown-toggle { + padding: 19px 10px 10px; +} +.page-header .top-menu .dropdown-quick-sidebar-toggler>.dropdown-toggle i { + top: 0 +} +.page-header .top-menu .dropdown-quick-sidebar-toggler>.dropdown-toggle i:before { + content: "" +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown-extended .dropdown-menu>li.external h3 { + text-transform: uppercase; + padding: 2px 0; + font-size: 14px; +} +.page-header.navbar .top-menu .navbar-nav>li.dropdown.language-switch>.dropdown-toggle { + padding: 13px 0px 12px; + display: block; +} +/****************************************************************************************** + + [ 4. SIDE MENU ] + +*******************************************************************************************/ + +.sidemenu-container, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover {} .sidemenu-container .sidemenu>li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a { + /* border-bottom: 1px solid #1c262f; */ + color: #b7c0cd; + font-weight: 500 !important; +} +.sidemenu-container .sidemenu>li>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a>i { + color: currentColor +} +.sidemenu-container .sidemenu>li>a>i[class*=icon-], +.sidemenu-container .sidemenu>li>a>i[class^=icon-], +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a>i[class*=icon-], +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a>i[class^=icon-] { + color: #6b788b; +} +.sidemenu-container .sidemenu>li>a>.arrow.open:before, +.sidemenu-container .sidemenu>li>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a>.arrow:before { + color: #606C7D; +} +.sidemenu-container .sidemenu>li.heading>h4, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.heading>h4 { + color: #708096; +} +.sidemenu-container .sidemenu>li.open>a, +.sidemenu-container .sidemenu>li:hover>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a { + background-color: #273244; + color: #fff; +} +.sidemenu-container .sidemenu>li.open>a>.arrow.open:before, +.sidemenu-container .sidemenu>li.open>a>.arrow:before, +.sidemenu-container .sidemenu>li.open>a>i, +.sidemenu-container .sidemenu>li:hover>a>.arrow.open:before, +.sidemenu-container .sidemenu>li:hover>a>.arrow:before, +.sidemenu-container .sidemenu>li:hover>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:hover>a>i { + color: #fff +} +.sidemenu-container .sidemenu>li.active.open>a, +.sidemenu-container .sidemenu>li.active>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + background-color: #273244; + border-top-color: transparent; + color: #fff; +} +.sidemenu-container .sidemenu>li.active.open>a:hover, +.sidemenu-container .sidemenu>li.active>a:hover, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a:hover, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a:hover { + background-color: #273244; + color: white; +} +.sidemenu-container .sidemenu>li.active.open>a>.arrow.open:before, +.sidemenu-container .sidemenu>li.active.open>a>.arrow:before, +.sidemenu-container .sidemenu>li.active.open>a>i, +.sidemenu-container .sidemenu>li.active>a>.arrow.open:before, +.sidemenu-container .sidemenu>li.active>a>.arrow:before, +.sidemenu-container .sidemenu>li.active>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>i { + color: #fff; +} +.sidemenu-container .sidemenu>li.active+li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active+li>a { + border-top-color: transparent; +} +.sidemenu-container .sidemenu>li.active.open+li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active.open+li>a { + border-top-color: #3d4957; +} +.sidemenu-container .sidemenu>li:last-child>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li:last-child>a { + border-bottom: 1px solid transparent!important; +} +.sidemenu-container .sidemenu li:hover>a>.arrow.open:before, +.sidemenu-container .sidemenu li:hover>a>.arrow:before, +.sidemenu-container .sidemenu li>a>.arrow.open:before, +.sidemenu-container .sidemenu li>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li:hover>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li:hover>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li>a>.arrow:before { + color: currentColor; +} +.sidemenu-container .sidemenu li.active>a>.arrow.open:before, +.sidemenu-container .sidemenu li.active>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li.active>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li.active>a>.arrow:before { + color: #fff; +} +/* .sidemenu-closed .sidemenu-container .sidemenu:hover .sub-menu, +.sidemenu-closed .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu:hover .sub-menu { + background-color: #1C262F; +} */ +.sidemenu-container .sidemenu .sub-menu>li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a { + color: #cccbcb; + font-weight: 500 !important; +} +.sidemenu-container .sidemenu .sub-menu>li>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a>i { + color: #cccbcb; +} +.sidemenu-container .sidemenu .sub-menu>li>a>i[class*=icon-], +.sidemenu-container .sidemenu .sub-menu>li>a>i[class^=icon-], +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a>i[class*=icon-], +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a>i[class^=icon-] { + color: #ffffff; +} +.sidemenu-container .sidemenu .sub-menu>li>a>.arrow.open:before, +.sidemenu-container .sidemenu .sub-menu>li>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li>a>.arrow:before { + color: #ffffff; +} +.sidemenu-container .sidemenu .sub-menu>li.active>a, +.sidemenu-container .sidemenu .sub-menu>li.open>a, +.sidemenu-container .sidemenu .sub-menu>li:hover>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a { + color: #ffffff; +} +.sidemenu-container .sidemenu .sub-menu>li.active>a>i, +.sidemenu-container .sidemenu .sub-menu>li.open>a>i, +.sidemenu-container .sidemenu .sub-menu>li:hover>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a>i { + color: #ffffff; +} +.sidemenu-container .sidemenu .sub-menu>li.active>a>.arrow.open:before, +.sidemenu-container .sidemenu .sub-menu>li.active>a>.arrow:before, +.sidemenu-container .sidemenu .sub-menu>li.open>a>.arrow.open:before, +.sidemenu-container .sidemenu .sub-menu>li.open>a>.arrow:before, +.sidemenu-container .sidemenu .sub-menu>li:hover>a>.arrow.open:before, +.sidemenu-container .sidemenu .sub-menu>li:hover>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.active>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li.open>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu>li:hover>a>.arrow:before { + color: #ffffff; +} +.sidemenu-container .sidebar-search .input-group .input-group-btn .btn>i, +.sidemenu-closed .sidemenu-container .sidebar-search.open .remove>i, +.sidemenu-closed .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.open .remove>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group .input-group-btn .btn>i { + color: #B4BCC8; +} +.sidemenu-container .sidebar-toggler, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler { + background: #2c3541; +} +.sidemenu-container .sidebar-toggler>span, +.sidemenu-container .sidebar-toggler>span:after, +.sidemenu-container .sidebar-toggler>span:before, +.sidemenu-container .sidebar-toggler>span:hover, +.sidemenu-container .sidebar-toggler>span:hover:after, +.sidemenu-container .sidebar-toggler>span:hover:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:hover, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:hover:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:hover:before { + background: #a7b5c6; +} +.sidemenu-container .sidebar-toggler.th-toggle-exit>span, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler.th-toggle-exit>span { + background-color: transparent!important; +} +.sidemenu-container .sidebar-toggler:hover, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler:hover { + background: #212832; +} +.sidemenu-container .sidebar-search .input-group, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group { + border-bottom: 1px solid #b4bcc8; +} +.sidemenu-container .sidebar-search .input-group .form-control, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group .form-control { + background-color: rgba(255, 255, 255, 0); + color: #ffffff; +} +.sidemenu-container .sidebar-search .input-group .form-control::-moz-placeholder, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group .form-control::-moz-placeholder { + color: #4e5d6f; + opacity: 1; +} +.sidemenu-container .sidebar-search .input-group .form-control:-ms-input-placeholder, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group .form-control:-ms-input-placeholder { + color: #4e5d6f; +} +.sidemenu-container .sidebar-search .input-group .form-control::-webkit-input-placeholder, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group .form-control::-webkit-input-placeholder { + color: #4e5d6f; +} +.page-header .search-form-opened .input-group .form-control::-webkit-input-placeholder { /* Chrome/Opera/Safari */ + color: #c0c0c0; + opacity: 1; +} +.page-header .search-form-opened .input-group .form-control::-moz-placeholder { /* Firefox 19+ */ + color: #c0c0c0; + opacity: 1; +} +.page-header .search-form-opened .input-group .form-control:-ms-input-placeholder { /* IE 10+ */ + color: #c0c0c0; + opacity: 1; +} +.page-header .search-form-opened .input-group .form-control:-moz-placeholder { /* Firefox 18- */ + color: #c0c0c0; + opacity: 1; +} +.sidemenu-container .sidebar-search.sidebar-search-bordered .input-group, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.sidebar-search-bordered .input-group { + border: 1px solid #435060; +} +.sidemenu-closed .sidemenu-container .sidebar-search.open .input-group, +.sidemenu-closed .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.open .input-group { + background-color: #1C262F; +} +.sidemenu-closed .sidemenu-container .sidebar-search.sidebar-search-solid .input-group, +.sidemenu-closed .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.sidebar-search-solid .input-group { + background: 0 0; +} +.sidemenu-container .sidebar-search.sidebar-search-solid .input-group, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.sidebar-search-solid .input-group { + border: 1px solid #2c3541; + background: #2c3542; +} +.sidemenu-container .sidebar-search.sidebar-search-solid .input-group .form-control, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.sidebar-search-solid .input-group .form-control { + background: #2c3541; +} +.sidemenu-container .sidebar-search.sidebar-search-solid.open .input-group, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.sidebar-search-solid.open .input-group { + border: 1px solid #1C262F; + background: #1C262E; +} +.sidemenu-container .sidebar-search.sidebar-search-solid.open .input-group .form-control, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.sidebar-search-solid.open .input-group .form-control { + background: #1C262F; +} +.sidemenu-container .badge { + font-size: 10px!important +} +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover.navbar-collapse, +.sidemenu-container.navbar-collapse { + padding: 0; + box-shadow: none +} +.sidemenu-container .sidemenu, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu { + list-style: none; + margin: 0; + padding: 0 +} +.sidemenu-container .sidemenu>li, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li { + display: block; + margin: 0; + border: 0 +} +.sidemenu-container .sidemenu>li.sidebar-search-wrapper, +.sidemenu-container .sidemenu>li.sidebar-toggler-wrapper, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.sidebar-search-wrapper, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.sidebar-toggler-wrapper { + border: 0 !important +} +.sidemenu-container .sidemenu>li.sidebar-search-wrapper:after, +.sidemenu-container .sidemenu>li.sidebar-search-wrapper:before, +.sidemenu-container .sidemenu>li.sidebar-toggler-wrapper:after, +.sidemenu-container .sidemenu>li.sidebar-toggler-wrapper:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.sidebar-search-wrapper:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.sidebar-search-wrapper:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.sidebar-toggler-wrapper:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.sidebar-toggler-wrapper:before, +.sidebar-user-panel::before, .sidebar-user-panel::after { + content: " "; + display: table +} +.sidebar-user-panel::after { + clear: both; +} +.sidemenu-container .sidemenu>li.start>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.start>a { + border-top-color: transparent !important +} +.sidemenu-container .sidemenu>li.last>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.last>a { + border-bottom-color: transparent !important +} +.sidemenu-container .sidemenu>li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a { + display: block; + position: relative; + margin: 0; + padding: 17px 15px; + text-decoration: none; + font-size: 14px; + font-weight: 300 +} +.sidemenu-container .sidemenu>li>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a>i { + font-size: 18px; + margin-right: 5px; + text-shadow: none; + float: left; + line-height: 24px; +} +.sidemenu-container .sidemenu.sidemenu-closed>li>a>i { + float: none; +} +.sidemenu-container .sidemenu>li>a>[class^=icon-], +.sidemenu-container .sidemenu>li>a>i.glyphicon, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a>[class^=icon-], +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a>i.glyphicon { + margin-left: 1px; + margin-right: 4px +} +.sidemenu-container-fixed .sidemenu-container .sidemenu>li>a, +.sidemenu-container-fixed .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a { + transition: all .2s ease +} +.sidemenu-container-reversed.sidemenu-container-fixed .sidemenu-container .sidemenu>li>a, +.sidemenu-container-reversed.sidemenu-container-fixed .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a { + transition: none +} +.sidemenu-container .sidemenu>li.heading, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.heading { + padding: 15px +} +.sidemenu-container .sidemenu>li.heading>h3, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.heading>h3 { + margin: 0; + padding: 0; + font-size: 14px; + font-weight: 300 +} +.sidemenu-container .sidemenu>li.heading+li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.heading+li>a { + border-top: 0 +} +.sidemenu-container .sidemenu>li.open>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.open>a { + font-size: 14px +} +.sidemenu-container .sidemenu>li.active>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a { + border: none; + text-shadow: none; + font-size: 14px +} +.sidemenu-container .sidemenu>li.active>a>.selected, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.selected { + display: block; + float: right; + position: absolute; + right: 0; + top: 8px; + background: 0 0; + width: 0; + height: 0; +} +.sidemenu-container-reversed .sidemenu-container .sidemenu>li.active>a>.selected, +.sidemenu-container-reversed .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.selected { + right: auto; + left: 0; + border-right: 0; + border-left: 8px solid #fff +} +.page-container-bg-solid .sidemenu-container .sidemenu>li.active>a>.selected, +.page-container-bg-solid .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.selected { + border-color: transparent #eef1f5 transparent transparent +} +.page-container-bg-solid.sidemenu-container-reversed .sidemenu-container .sidemenu>li.active>a>.selected, +.page-container-bg-solid.sidemenu-container-reversed .sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li.active>a>.selected { + border-color: transparent transparent transparent #eef1f5 +} +.sidemenu-container .sidemenu li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li>a { + position: relative +} +.sidemenu-container .sidemenu li>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li>a>.arrow:before { + float: right; + width: 20px; + text-align: center; + display: inline; + font-size: 16px; + font-family: FontAwesome; + height: auto; + content: "\f105"; + font-weight: 300; + text-shadow: none; + position: absolute; + top: 4px; + right: 14px +} +.sidemenu-container .sidemenu li>a>.arrow.open:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li>a>.arrow.open:before { + content: "\f107" +} +.sidemenu-container .sidemenu li>a>.badge, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li>a>.badge { + float: right; + margin-top: 1px; + margin-right: 0; + position: absolute; + right: 14px; + top: 6px +} +.sidemenu-container .sidemenu>li>a>.arrow:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu>li>a>.arrow:before { + top: 14px +} +.sidemenu-container .sidemenu .sub-menu, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu { + list-style: none; + display: none; + padding: 0 0 15px 0; + margin: 0; + background-color: #1e293c; +} +.sidemenu-container .sidemenu .sub-menu li, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu li { + background: 0 0; + margin: 0; + padding: 0; +} +.sidemenu-container .sidemenu .sub-menu li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu li>a { + display: block; + margin: 0; + padding: 8px 15px 8px 43px; + text-decoration: none; + font-size: 14px; + font-weight: 300; + background: 0 0 +} +.sidemenu-container .sidemenu .sub-menu li>a>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu li>a>i { + font-size: 14px +} +.sidemenu-container .sidemenu .sub-menu li>.sub-menu, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu li>.sub-menu { + margin: 0 +} +.sidemenu-container .sidemenu .sub-menu li>.sub-menu>li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu li>.sub-menu>li>a { + padding-left: 60px +} +.sidemenu-container .sidemenu .sub-menu li>.sub-menu>li>.sub-menu, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu li>.sub-menu>li>.sub-menu { + margin: 0 +} +.sidemenu-container .sidemenu .sub-menu li>.sub-menu>li>.sub-menu>li>a, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu li>.sub-menu>li>.sub-menu>li>a { + padding-left: 80px +} +.sidemenu-container .sidemenu .sub-menu.always-open, +.sidemenu-container .sidemenu li.active>.sub-menu, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu .sub-menu.always-open, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidemenu li.active>.sub-menu { + display: block +} +.sidemenu-container .sidebar-toggler, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler { + -webkit-transition: opacity .3s; + -moz-transition: opacity .3s; + -ms-transition: opacity .3s; + -o-transition: opacity .3s; + transition: opacity .3s; + display: block; + cursor: pointer; + opacity: .7; + filter: alpha(opacity=70); + padding: 6px 8px; + margin-top: 15px; + margin-right: 16px; + float: right; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px +} +.sidemenu-container .sidebar-toggler>span:hover, +.sidemenu-container .sidebar-toggler>span:hover:after, +.sidemenu-container .sidebar-toggler>span:hover:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:hover, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:hover:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:hover:before { + background: #fff +} +.sidemenu-container .sidebar-toggler>span, +.sidemenu-container .sidebar-toggler>span:after, +.sidemenu-container .sidebar-toggler>span:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:before { + display: inline-block; + width: 16px; + height: 1px; + background: #fff; + position: relative; + top: -5px; + transition: all ease .3s +} +.sidemenu-container .sidebar-toggler>span:after, +.sidemenu-container .sidebar-toggler>span:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:before { + position: absolute; + left: 0; + content: '' +} +.sidemenu-container .sidebar-toggler>span:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:before { + top: 5px +} +.sidemenu-container .sidebar-toggler>span:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler>span:after { + top: -5px +} +.sidemenu-container .sidebar-toggler.th-toggle-exit>span, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler.th-toggle-exit>span { + background-color: transparent !important +} +.sidemenu-container .sidebar-toggler.th-toggle-exit>span:after, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler.th-toggle-exit>span:after { + -webkit-transform: translateY(5px) rotateZ(45deg); + -moz-transform: translateY(5px) rotateZ(45deg); + -ms-transform: translateY(5px) rotateZ(45deg); + -o-transform: translateY(5px) rotateZ(45deg); + transform: translateY(5px) rotateZ(45deg) +} +.sidemenu-container .sidebar-toggler.th-toggle-exit>span:before, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler.th-toggle-exit>span:before { + -webkit-transform: translateY(-5px) rotateZ(-45deg); + -moz-transform: translateY(-5px) rotateZ(-45deg); + -ms-transform: translateY(-5px) rotateZ(-45deg); + -o-transform: translateY(-5px) rotateZ(-45deg); + transform: translateY(-5px) rotateZ(-45deg) +} +.sidemenu-container .sidebar-toggler:hover, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-toggler:hover { + -webkit-transition: opacity .3s; + -moz-transition: opacity .3s; + -ms-transition: opacity .3s; + -o-transition: opacity .3s; + transition: opacity .3s; + opacity: 1; + filter: alpha(opacity=100) +} +.sidemenu-container .sidebar-search, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search { + padding: 0; + margin: 12px 18px +} +.sidemenu-container .sidebar-search .remove, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .remove { + display: none +} +.sidemenu-container .sidebar-search .remove>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .remove>i { + font-size: 16px +} +.sidemenu-container .sidebar-search .input-group, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px +} +.sidemenu-container .sidebar-search .input-group .form-control, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group .form-control { + border: 0; + font-size: 14px; + padding: 0; + height: auto; + line-height: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px +} +.sidemenu-container .sidebar-search .input-group .input-group-btn .btn, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group .input-group-btn .btn { + padding: 2px 0 0; + background-color: transparent; + background-repeat: no-repeat; + background-position: 100% 3px +} +.sidemenu-container .sidebar-search .input-group .input-group-btn .btn>i, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search .input-group .input-group-btn .btn>i { + font-size: 15px +} +.sidemenu-container .sidebar-search.sidebar-search-bordered, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.sidebar-search-bordered { + margin: 25px 18px +} +.sidemenu-container .sidebar-search.sidebar-search-bordered .input-group .form-control, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.sidebar-search-bordered .input-group .form-control { + font-size: 13px; + padding: 6px 8px +} +.sidemenu-container .sidebar-search.sidebar-search-bordered .input-group .input-group-btn .btn, +.sidemenu-closed.sidemenu-container-fixed .sidemenu-container:hover .sidebar-search.sidebar-search-bordered .input-group .input-group-btn .btn { + margin-right: 6px +} +.sidemenu-closed.sidemenu-closed-hidelogo .page-header.navbar .menu-toggler.sidebar-toggler { + margin-right: 13px; + background: none; +} +.sidebar-container .sidemenu>li.sidebar-mobile-offcanvas-toggler { + display: none +} +.sidemenu-closed .user-panel { + display: none; +} +.sidemenu-container{ + background-color: #222c3c; +} +.sidemenu-closed .sidemenu-container .slimScrollDiv { + overflow: visible!important; + height: 100%!important; +} +.sidemenu-closed .sidemenu-container .slimscroll-style { + overflow: visible!important; + height: 100%!important; +} +.sidemenu-container.fixed-menu { + position: fixed; + z-index: 999; +} +.sidemenu-closed .sidemenu-container.fixed-menu { + position: relative; +} +.sidemenu-container-reversed .sidemenu-container.fixed-menu { + right: 0; +} +/********************************************************************* + + [5. SEARCH BAR ] + +**********************************************************************/ + +.input-group-btn .search-btn { + padding: 7px 12px 7px; +} +.search-bar-form { + padding: 0px 0px; +} +.search-form::-webkit-input-placeholder { + color: #B4BCC8 !important; +} +.search-form:-moz-placeholder { + color: #B4BCC8 !important; +} +.search-form::-moz-placeholder { + color: #B4BCC8 !important; +} +.search-form:-ms-input-placeholder { + color: #B4BCC8 !important; +} +/************************************************************** + + [6. NAVIGATION ] + +***************************************************************/ + +.nav-pills, +.nav-tabs { + margin-bottom: 10px +} +.nav-pills>li>a, +.nav-tabs>li>a { + font-size: 14px; + -webkit-border-radius: 2px 2px 0 0; + -moz-border-radius: 2px 2px 0 0; + -ms-border-radius: 2px 2px 0 0; + -o-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0 +} +.nav-pills>li>a>.badge, +.nav-tabs>li>a>.badge { + margin-top: -6px +} +.nav-pills>li .dropdown-menu:after, +.nav-pills>li .dropdown-menu:before, +.nav-tabs>li .dropdown-menu:after, +.nav-tabs>li .dropdown-menu:before { + display: none +} +.nav-pills.nav-pills-sm>li>a, +.nav-pills.nav-tabs-sm>li>a, +.nav-tabs.nav-pills-sm>li>a, +.nav-tabs.nav-tabs-sm>li>a { + font-size: 13px +} +.nav-pills .dropdown.open>.dropdown-toggle, +.nav-tabs .dropdown.open>.dropdown-toggle { + background: #eee; + color: #0d638f; + border-color: transparent +} +.tabs-left.nav-tabs, +.tabs-right.nav-tabs { + border-bottom: 0 +} +.tabs-left.nav-tabs>li, +.tabs-right.nav-tabs>li { + float: none +} +.tabs-left.nav-tabs>li>a, +.tabs-right.nav-tabs>li>a { + margin-right: 0; + margin-bottom: 3px +} +.tabs-left.nav-tabs { + border-right: 1px solid #ddd; + display: block; +} +.tabs-left.nav-tabs>li>a { + display: block; + margin-right: -1px +} +.tabs-left.nav-tabs>li>a:focus, +.tabs-left.nav-tabs>li>a:hover { + border-radius: 2px 0 0 2px; + border-color: #eee #ddd #eee #eee +} +.tabs-left.nav-tabs>li.active>a, +.tabs-left.nav-tabs>li.active>a:hover>li.active>a:focus, +.tabs-left.nav-tabs>li a.active, +.tabs-left.nav-tabs>li a.active:hover, .tabs-left.nav-tabs>li a.active:focus { + -webkit-border-radius: 2px 0 0 2px; + -moz-border-radius: 2px 0 0 2px; + -ms-border-radius: 2px 0 0 2px; + -o-border-radius: 2px 0 0 2px; + border-radius: 2px 0 0 2px; + border-color: #ddd transparent #ddd #ddd +} +.tabs-right.nav-tabs { + border-left: 1px solid #ddd; + display: block; +} +.tabs-right.nav-tabs>li>a { + display: block; + margin-left: -1px +} +.tabbable:after, +.tabbable:before { + display: table; + content: " " +} +.tabs-right.nav-tabs>li>a:focus, +.tabs-right.nav-tabs>li>a:hover { + border-radius: 0 2px 2px 0; + border-color: #eee #eee #eee #ddd +} +.tabs-right.nav-tabs>li.active>a, +.tabs-right.nav-tabs>li.active>a:hover>li.active>a:focus, +.tabs-right.nav-tabs>li a.active, +.tabs-right.nav-tabs>li a.active:hover, +.tabs-right.nav-tabs>li a.active:focus { + -webkit-border-radius: 0 2px 2px 0; + -moz-border-radius: 0 2px 2px 0; + -ms-border-radius: 0 2px 2px 0; + -o-border-radius: 0 2px 2px 0; + border-radius: 0 2px 2px 0; + border-color: #ddd #ddd #ddd transparent +} +.tabs-below>.nav-pills, +.tabs-below>.nav-tabs { + border-bottom: 0; + margin-bottom: 0; + margin-top: 10px +} +.tabs-below>.nav-tabs { + border-top: 1px solid #ddd; + margin-bottom: 0; + margin-top: 10px +} +.tabs-below>.nav-tabs>li>a { + margin-top: -1px; + margin-bottom: 0 +} +.tabs-below>.nav-tabs>li>a:focus, +.tabs-below>.nav-tabs>li>a:hover { + border-top-color: #ddd; + border-bottom-color: transparent +} +.tabs-below>.nav-tabs>li>a .dropdown-menu { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px +} +.tabs-below>.nav-tabs .active a, +.tabs-below>.nav-tabs .active a:hover .active a:focus { + -webkit-border-radius: 0 0 2px 2px; + -moz-border-radius: 0 0 2px 2px; + -ms-border-radius: 0 0 2px 2px; + -o-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px; + border-color: transparent #ddd #ddd!important +} +.tabbable:after { + clear: both +} +.tabbable-line>.nav-tabs { + border: none; + margin: 0 +} +.tabbable-line>.nav-tabs>li { + margin: 0; + border-bottom: 4px solid transparent +} +.tabbable-line>.nav-tabs>li>a { + background: 0 0!important; + border: 0; + margin: 0; + padding-left: 15px; + padding-right: 15px; + font-size: 18px; + color: #737373 +} +.tabbable-line>.nav-tabs>li>a>i { + color: #a6a6a6 +} +.tabbable-line>.nav-tabs>li.active, +.tabbable-line>.nav-tabs>li a.active, +.borderBox .tabbable-line>.nav-tabs>li a.active { + background: 0 0; + border-bottom: 4px solid #36c6d3; + position: relative +} +.tabbable-line>.nav-tabs>li.active>a { + border: 0; + font-size: 18px; + color: #333 +} +.tabbable-line>.nav-tabs>li.active>a>i { + color: #404040 +} +.tabbable-line>.nav-tabs>li.open, +.tabbable-line>.nav-tabs>li:hover { + background: 0 0; +} +.tabbable-line>.nav-tabs>li.open>a, +.tabbable-line>.nav-tabs>li:hover>a { + border: 0; + background: 0 0!important; + color: #333 +} +.tabbable-line>.nav-tabs>li.open>a>i, +.tabbable-line>.nav-tabs>li:hover>a>i { + color: #a6a6a6 +} +.tabbable-line>.tab-content { + margin-top: 0; + border: 0; + border-top: 1px solid #eef1f5; + padding: 30px 0 +} +.page-container-bg-solid .tabbable-line>.tab-content { + border-top: 1px solid #dae2ea +} +.tabbable-line>.tab-content { + padding-bottom: 0 +} +.tabbable-line.tabs-below>.nav-tabs>li { + border-top: 4px solid transparent +} +.tabbable-line.tabs-below>.nav-tabs>li:hover { + border-bottom: 0; + border-top: 4px solid #fbdcde +} +.tabbable-line.tabs-below>.nav-tabs>li.active { + margin-bottom: -2px; + border-bottom: 0; + border-top: 4px solid #ed6b75 +} +.tabbable-line.tabs-below>.tab-content { + margin-top: -10px; + border-top: 0; + border-bottom: 1px solid #eee; + padding-bottom: 15px +} +.tabbable-bordered { + margin-top: 20px +} +.tabbable-bordered .nav-tabs { + margin-bottom: 0; + border-bottom: 0 +} +.tabbable-bordered .tab-content { + padding: 30px 20px 20px; + border: 1px solid #ddd; + background: #fff +} +/**************************************************************** + + [7. PANEL ] + +*****************************************************************/ + +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading-gray { + background: #eee +} +.panel-heading-purple { + background: #a860c5; + color: white; +} +.panel-heading-yellow { + background: #ECB301; + color: white; +} +.panel-heading-blue { + background: #428BCA; + color: white; +} +.panel-heading-red { + background: #D9534F; + color: white; +} +.panel-heading-green { + background: #8BDB00; + color: white; +} +.panel-heading a, +.panel-heading a:active, +.panel-heading a:focus, +.panel-heading a:hover { + text-decoration: none +} +.panel-group .panel { + overflow: visible +} +.panel .panel-title>a:hover { + text-decoration: none +} +/******************************************************************** + + [8. PAGE CONTENT ] + +*********************************************************************/ + +.page-title { + padding: 0; + font-size: 28px; + letter-spacing: -1px; + display: block; + color: #666; + margin: 0 0 15px; + font-weight: 300 +} +.page-title small { + font-size: 14px; + letter-spacing: 0; + font-weight: 300; + color: #888 +} +.page-container-bg-solid .page-title, +.page-content-white .page-title { + color: #666; + margin-bottom: 15px; + margin-top: 15px +} +.page-container-bg-solid .page-title small, +.page-content-white .page-title small { + color: #666 +} +.page-content-white .page-title { + font-size: 24px +} +.page-bar { + padding: 0; + background-color: #f1f4f7; + margin-bottom: 25px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px +} +.page-bar:after, +.page-bar:before { + content: " "; + display: table +} +.page-bar .page-breadcrumb { + display: inline-block; + float: left; + padding: 8px; + margin: 0; + list-style: none; + background-color: transparent; + border-radius: 50px; + background: rgba(220, 208, 208, 0.3); + padding-left: 20px !important; +} +.page-bar .page-breadcrumb>li { + display: inline-block +} +.ie8 .page-bar .page-breadcrumb>li { + margin-right: 1px +} +.page-bar .page-breadcrumb>li>a, +.page-bar .page-breadcrumb>li>span { + color: #888; + font-size: 14px; + text-shadow: none +} +.page-bar .page-breadcrumb>li>i { + color: #aaa; + font-size: 14px; + text-shadow: none +} +.page-bar .page-breadcrumb>li>i[class*=icon-], +.page-bar .page-breadcrumb>li>i[class^=icon-] { + color: gray +} +.page-bar .page-toolbar { + display: inline-block; + float: right; + padding: 0 +} +.page-title-breadcrumb .breadcrumb li+li:before { + content: ""; + padding: 0; +} +.page-bar .page-toolbar .btn-fit-height { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + -ms-border-radius: 0 4px 4px 0; + -o-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; + padding-top: 8px; + padding-bottom: 8px +} +.page-md .page-bar .page-toolbar .btn-fit-height { + padding-top: 9px; + padding-bottom: 9px; + box-shadow: none !important +} +.page-container-bg-solid .page-bar, +.page-content-white .page-bar { + background-color: #eaeef3; + position: relative; + padding: 0 20px; + margin: 0px -20px 15px; +} +.page-container-bg-solid .page-bar .page-breadcrumb, +.page-content-white .page-bar .page-breadcrumb { + padding: 15px 15px; + margin-top: 10px; +} +.page-container-bg-solid .page-bar .page-breadcrumb>li>a, +.page-container-bg-solid .page-bar .page-breadcrumb>li>span, +.page-content-white .page-bar .page-breadcrumb>li>a, +.page-content-white .page-bar .page-breadcrumb>li>span { + color: #888; + text-decoration: none; +} +.parent-item:hover { + color: #1EBDCC !important; +} +.page-container-bg-solid .page-bar .page-breadcrumb>li>i, +.page-content-white .page-bar .page-breadcrumb>li>i { + color: #aaa +} +.page-container-bg-solid .page-bar .page-breadcrumb>li>i.fa-circle, +.page-content-white .page-bar .page-breadcrumb>li>i.fa-circle { + font-size: 5px; + margin: 0 5px; + position: relative; + top: -3px; + opacity: .4; + filter: alpha(opacity=40) +} +.page-container-bg-solid .page-bar .page-breadcrumb>li>i[class*=icon-], +.page-container-bg-solid .page-bar .page-breadcrumb>li>i[class^=icon-], +.page-content-white .page-bar .page-breadcrumb>li>i[class*=icon-], +.page-content-white .page-bar .page-breadcrumb>li>i[class^=icon-] { + color: #8c8c8c +} +.page-container-bg-solid .page-bar .page-toolbar, +.page-content-white .page-bar .page-toolbar { + padding: 6px 0 +} +.page-container-bg-solid .page-bar .page-toolbar .btn, +.page-content-white .page-bar .page-toolbar .btn { + margin-top: -2px +} +.page-container-bg-solid .page-bar .page-toolbar .btn.btn-sm, +.page-content-white .page-bar .page-toolbar .btn.btn-sm { + margin-top: 0 +} +.page-content { + margin-top: 0; + padding: 0; + background-color: #eaeef3; +} +.page-full-width .page-content { + margin-left: 0 !important +} +/************************************************************** + + [9. FORM ] + +***************************************************************/ + +.form { + padding: 0!important +} +.form .form-body, +.form-body { + padding: 20px +} +.form .form-body, +.form-body { + padding-left: 0; + padding-right: 0 +} +.form .form-actions, +.form-actions { + padding: 20px; + margin: 0; + background-color: #f5f5f5 +} +.form .form-actions, +.form-actions { + background: 0 0; + padding-left: 0; + padding-right: 0 +} +.form .form-actions.nobg, +.form-actions.nobg, +.tile .tile-object { + background-color: transparent +} +.form .form-actions.noborder, +.form-actions.noborder { + border-top: 0 +} +.form .form-actions, +.form-actions { + -webkit-border-radius: 0 0 2px 2px; + -moz-border-radius: 0 0 2px 2px; + -ms-border-radius: 0 0 2px 2px; + -o-border-radius: 0 0 2px 2px; + border-radius: 0 0 2px 2px +} +.form .form-actions:after, +.form .form-actions:before, +.form-actions:after, +.form-actions:before { + content: " "; + display: table +} +.form .form-actions:after, +.form-actions:after { + clear: both +} +.form .form-actions.right, +.form-actions.right { + padding-left: 0; + padding-right: 20px; + text-align: right +} +.form .form-actions.right, +.form-actions.right { + padding-right: 0 +} +.form .form-actions.left, +.form-actions.left { + padding-left: 20px; + padding-right: 0; + text-align: left +} +.control-label { + margin-top: 1px; + font-weight: 400 +} +.control-label .required, +.form-group .required { + color: #e02222; + font-size: 12px; + padding-left: 2px +} +.form-inline input { + margin-bottom: 0!important +} +.checkbox-list>label.checkbox-inline:first-child, +.checkbox>label, +.form-horizontal .checkbox>label, +.form .form-actions.left, +.form-actions.left, +.radio-list>label.radio-inline:first-child { + padding-left: 0 +} +.form .form-actions.top, +.form-actions.top { + margin-top: 0; + margin-bottom: 20px; + border-top: 0 +} +.form .form-actions.top, +.form-actions.top { + background: 0 0 +} +.form .form-actions .btn-set, +.form-actions .btn-set { + display: inline-block +} +.form .form-section, +.form-section { + margin: 30px 0; + padding-bottom: 5px +} +.form .form-bordered .form-group .help-block, +.form .form-row-seperated .form-group .help-block, +.form-horizontal .radio-list>label { + margin-bottom: 0 +} +.form-fit .form .form-section, +.form-fit .form-section { + margin-left: 20px; + margin-right: 20px +} +.checkbox, +.form-horizontal .checkbox { + padding: 0 +} +.radio-list>label { + display: block +} +.form-control-static, +.input-inline, +.radio-list>label.radio-inline { + display: inline-block +} +.form-horizontal .radio-list .radio { + padding-top: 1px +} +.form-horizontal .radio>span { + margin-top: 2px +} +.form .form-row-seperated { + padding: 0 +} +.form .form-row-seperated .form-group { + margin: 0; + border-bottom: 1px solid #efefef; + padding: 15px 0 +} +.form .form-row-seperated .form-group.last { + border-bottom: 0; + margin-bottom: 0; + padding-bottom: 13px +} +.form .form-row-seperated .form-body { + padding: 0 +} +.form .form-row-seperated .form-actions { + padding-left: 15px!important; + padding-right: 15px!important +} +.form .form-bordered .form-group { + margin: 0; + border-bottom: 1px solid #efefef +} +.form .form-bordered .form-group>div { + padding: 15px; + border-left: 1px solid #efefef +} +.form .form-bordered .form-group.last { + border-bottom: 0 +} +.form .form-bordered .form-group .control-label { + padding-top: 20px +} +.form .form-bordered .form-group .form-control { + margin: 0 +} +.form .form-bordered .form-body { + margin: 0; + padding: 0 +} +.form .form-bordered .form-actions { + margin-top: 0; + padding-left: 16px!important; + padding-right: 16px!important +} +.form .form-horizontal.form-bordered.form-row-stripped .form-group:nth-child(even) { + background-color: #fcfcfc +} +.form .form-horizontal.form-bordered.form-row-stripped .form-control { + background: #fff!important +} +.form .form-horizontal.form-bordered.form-label-stripped .form-group:nth-child(even)>div { + background-color: #fff +} +.form .form-horizontal.form-bordered.form-label-stripped .form-group:nth-child(even) { + background-color: #fcfcfc +} +.form-horizontal .form-group .input-sm { + margin-top: 3px +} +.form-horizontal .form-group .form-control-static { + margin-top: 1px +} +.form-control { + display: block; + width: 100%; + height: 39px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075); + -webkit-transition: border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s; + outline: 0!important; + box-shadow: none!important; +} +select[multiple], select[size], textarea.form-control { + height: auto; +} +select.input-sm { + height: 30px !important; + line-height: 30px; +} +select.form-control.form-control-sm{ + height: 30px !important; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.input-height { + height: 45px !important; +} +.form-control.height-auto { + height: auto +} +.form-horizontal .control-label.small-label { + float: left; + text-align: center; +} +textarea.form-control-textarea { + float: left; + width: 100%; +} +.input-group-addon>i { + color: #c5cdda +} +.form-control.white { + border-color: #fff +} +.form-control.white:focus { + border-color: #e6e6e6 +} +.form-control.focus-white:focus { + border-color: #fff +} +.form-control.default { + border-color: #e1e5ec +} +.form-control.default:focus { + border-color: #c2cad8 +} +.form-control.focus-default:focus { + border-color: #e1e5ec +} +.form-control.dark { + border-color: #2f353b +} +.form-control.dark:focus { + border-color: #181c1f +} +.form-control.focus-dark:focus { + border-color: #2f353b +} +.form-control.blue { + border-color: #3598dc +} +.form-control.blue:focus { + border-color: #217ebd +} +.form-control.focus-blue:focus { + border-color: #3598dc +} +.form-control.green { + border-color: #32c5d2 +} +.form-control.green:focus { + border-color: #26a1ab +} +.form-control.focus-green:focus { + border-color: #32c5d2 +} +.form-control.grey { + border-color: #E5E5E5 +} +.form-control.grey:focus { + border-color: #ccc +} +.form-control.focus-grey:focus { + border-color: #E5E5E5 +} +.form-control.red { + border-color: #e7505a +} +.form-control.red:focus { + border-color: #e12330 +} +.form-control.focus-red:focus { + border-color: #e7505a +} +.form-control.yellow { + border-color: #c49f47 +} +.form-control.yellow:focus { + border-color: #a48334 +} +.form-control.focus-yellow:focus { + border-color: #c49f47 +} +.form-control.purple { + border-color: #8E44AD +} +.form-control.purple:focus { + border-color: #703688 +} +.form-control.focus-purple:focus { + border-color: #8E44AD +} +.form-inline .rt-chkbox { + margin-left: 15px; + margin-right: 15px +} +.form-control-static { + margin: 0 +} +.form-group .input-inline { + margin-right: 5px +} +.patient-img img { + height: 40px; + width: 40px; + border-radius: 50%; + box-shadow: 0px 5px 25px 0px rgba(0,0,0,0.2); + border: 1px solid #fff; +} +.form-material .form-control, .form-material .form-control.focus, .form-material .form-control:focus { + background-image: linear-gradient(#9675ce, #9675ce),linear-gradient(rgba(120,130,140,0.13), rgba(120,130,140,0.13)); + border: 0 none; + border-radius: 0; + box-shadow: none; + float: none; +} +.form-material .form-control { + background-color: rgba(0,0,0,0); + background-position: center bottom,center calc(99%); + background-repeat: no-repeat; + background-size: 0 2px,100% 1px; + padding: 0; + transition: background 0s ease-out 0s; +} +.form-material .form-control.focus, .form-material .form-control:focus { + background-size: 100% 2px,100% 1px; + outline: 0 none; + transition-duration: .3s; +} + +.fileinput .form-control { + width: 100%; + position: relative; +} +.fileinput .form-control { + padding-top: 7px; + padding-bottom: 5px; + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + cursor: text; +} +.fileinput-new .input-group-addon { + position: absolute; + right: 3px; + top: 3px; + z-index: 10 !important; +} + +/***************************************************************** + + [10. USER PANEL STYLE ] + +******************************************************************/ + +.user-panel { + float: left; + width: 100%; + color: #ccc; + padding: 10px 10px 20px 10px; +} +.user-online { + color: #26c281; +} +.user-img-circle { + background: #fff; + z-index: 1000; + position: inherit; + border: 1px solid rgba(52, 73, 94, 0.44); + padding: 2px; +} +.txtOnline { + color: #ccc; + font-size: 11px; +} +.user-panel .image img { + max-width: 100%; +} +.user-panel .image { + width: 35%; + max-width: 75px; +} +.user-panel .info { + width: 50%; + margin-left: 11px; + margin-top: 6px; +} +.user-panel .info p { + margin: 5px 0; +} +/************************************************************* + + [11. MODAL WINDOW ] + +*************************************************************/ + +.modal { + z-index: 10050; + outline: 0; + overflow-y: auto!important +} +.modal .modal-header { + border-bottom: 1px solid #EFEFEF +} +.modal .modal-header h3 { + font-weight: 300 +} +.modal .modal-header .close { + margin-top: 0!important +} +.modal .modal-dialog { + z-index: 10051 +} +.modal>.loading { + position: absolute; + top: 50%; + left: 50%; + margin-top: -22px; + margin-left: -22px +} +.modal.in .page-loading { + display: none +} +.modal-open { + overflow-y: auto!important +} +.modal-open-noscroll { + overflow-y: hidden!important +} +.modal-backdrop { + border: 0; + outline: 0 +} +.modal-backdrop, +.modal-backdrop.fade.in { + background-color: #333!important +} +.modal.draggable-modal .modal-header { + cursor: move +} +.modal .modal-content { + box-shadow: 0 8px 18px rgba(0, 0, 0, .18), 0 6px 6px rgba(0, 0, 0, .23) +} +.note .highlight, +.note code, +.note.note-default { + background-color: #fff +} +body[ng-controller] .modal-backdrop { + z-index: 10049 +} +body[ng-controller] .modal { + z-index: 10050 +} +.modal-full.modal-dialog { + width: 99% +} +.modal .modal-content { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + border: 0 +} +.modal .modal-content .modal-title { + font-weight: 400 +} +.modal .modal-content .modal-footer { + border: 0 +} +.modal-backdrop.in { + opacity: .2; + filter: alpha(opacity=20) +} +/**************************************************************************** + + [12. CHAT PANEL ] + +*****************************************************************************/ + +.chat { + margin: 0; + padding: 0; + margin-top: -15px; + margin-right: 10px; +} +.chat li { + list-style: none; + padding: 7px 0 5px; + margin: 7px auto; + font-size: 14px; + float: left; + width: 100%; +} +.chat li img.avatar { + height: 45px; + width: 45px; + float: left; + margin-right: 10px; + margin-top: 0px; + border-radius: 50% !important; +} +.nice-chat li.in .message { + background: #817CCE; + color: #fff; + border-radius: 5px; + -webkit-border-radius: 5px; +} +.chat li.in .message { + text-align: left; + margin-left: 65px; +} +.chat li .message { + display: block; + padding: 5px; + position: relative; +} +.nice-chat li.in .message .arrow { + border-right: 8px solid #817CCE; +} +.chat li.in .message .arrow { + display: block; + position: absolute; + top: 15px; + left: -8px; + width: 0; + height: 0; + border-top: 8px solid transparent; + border-bottom: 8px solid transparent; +} +.nice-chat li.in .message a.name, +.nice-chat li.in .message .datetime { + color: #fff; +} +.nice-chat li.in .message a.name { + font-weight: bold; +} +.chat li .name { + font-size: 15px; + font-weight: 400; +} +.nice-chat li.in .message a.name, +.nice-chat li.in .message .datetime { + color: #fff; +} +.nice-chat li.in .message .datetime { + opacity: .7; +} +.chat li .datetime { + color: #adadad; + font-size: 13px; + font-weight: 400; +} +.chat li .message .body { + display: block; +} +.chat li.out img.avatar { + float: right; + margin-left: 10px; + margin-top: 0px; +} +.nice-chat li.out .message { + background: #EFF0F4; + border-radius: 5px; + -webkit-border-radius: 5px; +} +.nice li.out .message { + border-right: 2px solid #EFF0F4; + margin-right: 65px; + text-align: right; +} +.nice li .message { + display: block; + padding: 5px; + position: relative; +} +.nice-chat li.out .message .arrow { + border-left: 8px solid #EFF0F4; +} +.chat li.out .message .arrow { + display: block; + position: absolute; + top: 15px; + right: -8px; + border-top: 8px solid transparent; + border-bottom: 8px solid transparent; + border-left: 8px solid #EFF0F4; +} +.chat li.out img.avatar { + float: right; + margin-left: 10px; + margin-top: 0px; +} +.chat li.out .message { + border-right: 2px solid #EFF0F4; + margin-right: 65px; + text-align: right; +} +.chat li .message { + display: block; + padding: 5px; + position: relative; +} +.chat-txt-form { + margin-top: 15px; + padding: 10px; + background-color: #EFF0F4; + clear: both; +} +.chat-form .form-group { + width: 83%; + margin-right: 2%; + float: left; +} +.chatpane>.toggler, +.chatpane>.toggler-close { + padding: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + top: 4px; + cursor: pointer +} +.chatpane { + width: 100%; + margin-top: -13px; + margin-right: 0; + z-index: 100; + float: right; + position: relative +} +.chatpane>.toggler { + right: 0; + position: absolute; + border-radius: 4px +} +.chatpane>.toggler:hover { + background-color: #3f4f62 !important +} +.chatpane>.toggler-close { + display: block !important; + right: 0; + z-index: 101; + position: absolute; + border-radius: 4px +} +.chatpane>.theme-options { + top: 4px; + right: 0; + display: none; + display: block !important; + z-index: 100; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px +} +.chatpane>.theme-options>.theme-option { + color: #c6cfda; + padding: 15px; + margin-top: 0; + margin-bottom: 0 +} +.chatpane>.theme-options>.theme-option>span { + text-transform: uppercase; + display: inline-block; + width: 145px; + font-size: 12px; + font-weight: 500; + font-family: Roboto,sans-serif; +} +.chatpane>.theme-options>.theme-option>select.form-control { + display: inline; + width: 135px; + padding: 2px; + text-transform: lowercase +} +.chatpane>.theme-options>.theme-option.theme-colors { + border-top: 0 +} +.chatpane>.theme-options>.theme-option.theme-colors>span { + display: block; + width: auto +} +.chatpane>.theme-options>.theme-option.theme-colors>ul { + list-style: none; + padding: 0; + display: block; + margin-bottom: 10px !important; + margin-top: 15px +} +.chatpane>.theme-options>.theme-option.theme-colors>ul>li { + width: 40px; + height: 40px; + margin: 0 4px; + cursor: pointer; + list-style: none; + float: left; + border: 1px solid #707070 +} +.chatpane>.theme-options>.theme-option.theme-colors>ul>li:first-child { + margin-left: 0 +} +.chatpane>.theme-options>.theme-option.theme-colors>ul>li.current, +.chatpane>.theme-options>.theme-option.theme-colors>ul>li:hover { + border: 2px solid #d64635 +} +.chatpane>.theme-options>.theme-option.theme-colors>ul>li.color-default { + background: #333438 +} +.page-container-bg-solid .chatpane, +.page-content-white .chatpane { + position: absolute; + margin-top: 30px; + margin-right: 20px; + right: 0 +} +.page-container-bg-solid.sidemenu-container-reversed.sidemenu-closed .chatpane, +.page-content-white.sidemenu-container-reversed.sidemenu-closed .chatpane { + margin-right: 65px +} +.chat-sidebar-open .page-header .top-menu .dropdown-quick-sidebar-toggler>.dropdown-toggle i:before, +.chat-sidebar-open .chat-sidebar-toggler>i:before { + content: "" +} +.chat-sidebar-toggler { + overflow: hidden; + z-index: 99999; + display: none; + width: 28px; + height: 27px; + position: fixed; + top: 10px; + right: 15px; + text-align: center; + padding-top: 6px +} +.chat-sidebar-toggler:hover { + background: #303a43 +} +.chat-sidebar-open .chat-sidebar-toggler { + display: inline-block +} +.chat-sidebar-open .chat-sidebar-toggler:hover { + background: 0 0 +} +.chat-sidebar-toggler>i { + color: #99a8b5; + font-size: 17px +} +.chat-sidebar-toggler>i:hover { + color: #fff !important +} +.chat-sidebar-container { + transition: right .3s; + z-index: 99999; + position: fixed; + top: 60px; + bottom: 0; + width: 320px; + right: -320px; + overflow: hidden; + color: #7d7b7b; + background: #ffffff; +} +.chat-sidebar-open .chat-sidebar-container { + transition: right .3s; + right: 0 +} +.chat-sidebar-container .chat-sidebar { + background: #ffffff; +} +.chat-sidebar-container .chat-sidebar .nav-tabs { + margin: 0; + padding: 0; + border: 0; + display: block; +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li { + display: table-cell !important; + width: 1% !important; + padding: 0; + margin: 0; + float: none +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li>a { + position: relative; + display: block; + text-align: center; + height: auto; + font-size: 14px; + padding: 10px 15px 8px; + text-transform: uppercase; + background: 0 0; + margin-right: 0; + color: #90a1af; + border: 0; + border-bottom: 3px solid rgba(21, 90, 214, 0.3); + -webkit-border-radius: 0; + -moz-border-radius: 0; + -ms-border-radius: 0; + -o-border-radius: 0; + border-radius: 0; + outline: 0 !important +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li>a .material-icons{ + vertical-align: middle; +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li>a>.badge { + position: absolute; + top: 10px; + right: 22px; +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li.active>a, +.chat-sidebar-container .chat-sidebar .nav-tabs>li>a.active, +.chat-sidebar-container .chat-sidebar .nav-tabs>li:hover>a { + border: 0; + border-bottom: 3px solid #060bbb; + background: 0 0; + color: #7d7b7b; + text-decoration: none +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li .dropdown-menu { + border: 0; + background: #36424c; + box-shadow: 5px 5px rgba(97, 117, 135, .1); + margin-top: 8px; + margin-right: 20px +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li .dropdown-menu:before { + position: absolute; + top: -7px; + right: 19px; + display: inline-block !important; + border-right: 7px solid transparent; + border-left: 7px solid transparent; + border-bottom: 7px solid #36424c; + content: '' +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li .dropdown-menu:after { + position: absolute; + top: -6px; + right: 20px; + display: inline-block !important; + border-right: 6px solid transparent; + border-left: 6px solid transparent; + border-bottom: 7px solid #36424c; + content: '' +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li .dropdown-menu>li>a { + padding: 10px 15px; + color: #99a8b5 +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li .dropdown-menu>li>a>i { + color: #93a3b1 +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li .dropdown-menu>li:hover>a { + background: #3d4a55; + color: #99a8b5 +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li .dropdown-menu>li:hover>a>i { + color: #9babb8 +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li .dropdown-menu>li.active>a { + background: #38444f; + color: #99a8b5 +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li .dropdown-menu>li.divider { + background-color: #3d4a55 +} +.chat-sidebar-container .chat-sidebar .nav-tabs>li.open>a.dropdown-toggle { + border-bottom: 3px solid #f3565d; + background: 0 0; + text-decoration: none; + color: #90a1af +} +.chat-sidebar-container .chat-sidebar .tab-content { + margin: 0; + padding: 0 +} +.chat-header { + background: #ddd; + padding-top: 10px; +} +.chat-sidebar-container .chat-sidebar .list-heading { + font-size: 14px; + margin: 0px 10px 10px 10px; + font-family: Roboto,sans-serif; + font-weight: 600; + color: #00000099; + background: transparent; + text-align: center; + line-height: 15px; + padding-bottom: 14px; + text-transform: uppercase; + border-bottom: 1px solid #80808040; +} +.chat-sidebar-container .chat-sidebar .list-items { + margin: 0; + padding: 0; + list-style: none +} +.chat-sidebar-container .chat-sidebar .list-items>li { + margin: 0; + padding: 15px; + background: #fff; + color: #585859; + border-bottom-width: 1px; + border-bottom-style: solid; + border-bottom-color: #ddd +} +.chat-sidebar-container .chat-sidebar .list-items>li:hover { + background: #ddd +} +.chat-sidebar-container .chat-sidebar .list-items>li:last-child { + border-bottom: 0 +} +.chat-sidebar-container .chat-sidebar .list-items.borderless li { + border: 0; + text-transform: uppercase; + font-family: Roboto,sans-serif; + font-size: 12px; + font-weight: 500; +} +.chat-sidebar-container .chat-sidebar .inner-content { + margin: 0px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-list { + position: absolute !important; + width: 320px !important; + transition: margin .3s +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-item { + position: absolute !important; + width: 320px !important; + transition: margin .3s; + margin-left: 320px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-item .page-quick-sidemenu { + padding: 15px 10px 0 +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-item .page-quick-sidemenu .chat-sidebar-back-to-list { + vertical-align: middle; + display: inline-block; + font-size: 14px; + color: #90a1af +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-item .page-quick-sidemenu .chat-sidebar-back-to-list:hover { + text-decoration: none +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-item .page-quick-sidemenu .chat-sidebar-back-to-list>i { + font-size: 17px; + line-height: 17px; + vertical-align: top; + margin-right: 3px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-content-item-shown .chat-sidebar-list { + transition: margin .3s; + margin-left: -320px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-content-item-shown .chat-sidebar-item { + transition: margin .3s; + margin-left: 0 +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users { + padding: 0; + position: relative; + border-left: 1px solid #e9e9e9; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media { + padding: 5px 15px 5px 15px; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .media-object { + border-radius: 50% !important; + width: 35px; + height: 35px; + filter: alpha(opacity=80); + float: left; + margin-right: 10px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .media-object:after, +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .media-object:before { + content: " "; + display: table +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .media-object:after { + clear: both +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media:hover { + cursor: pointer +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media:hover .media-object { + opacity: 1; + filter: alpha(opacity=100) +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .media-body .media-heading { + margin: 5px 0px 3px 0px; + font-size: 14px; + line-height: 10px; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .media-body .media-heading-sub { + font-size: 10px; + text-transform: uppercase; + color: #777 +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .media-body .media-heading-small { + font-size: 10px; + color: #5d7081 +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .media-status { + margin-top: 10px; + right: 10px; + position: absolute; + display: inline-block +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages { + padding: 0 10px; + border-left: 1px solid #e9e9e9; + position: relative +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post { + transition: display .3s; + padding: 5px 0; + margin: 10px auto; + font-size: 13px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post .body { + color: #333; + display: block +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post .body-out { + color: #fff; + display: block +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post .avatar { + width: 45.71px; + border-radius: 50% !important +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.in .avatar { + float: left; + margin-right: 10px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.out .avatar { + float: right; + margin-left: 10px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post .datetime, +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post .name { + font-size: 12px; + font-weight: 300; + color: #3C8DBC; + font-family: Roboto,sans-serif; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post .message { + display: block; + padding: 5px; + position: relative; + color: #90a1af; + background: #36424c; + border-radius: 5px; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.in .message { + text-align: left; + margin-left: 55px; + background: #eff0f4; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.in .message .arrow { + display: block; + position: absolute; + top: 9px; + left: -6px; + width: 0; + height: 0; + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + border-right-width: 6px; + border-right-style: solid; + border-right-color: #eff0f4 +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.in .msg-in { + text-align: left; + margin-left: 55px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.in .msg-in .arrow { + display: block; + position: absolute; + top: 9px; + left: -6px; + width: 0; + height: 0; + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + border-right-width: 6px; + border-right-style: solid; + border-right-color: #36424c +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.out .message { + margin-right: 55px; + text-align: right; + background: #817cce; +} +.chat-sidebar-chat-user { + background: #fff; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.out .message .arrow { + display: block; + position: absolute; + top: 9px; + right: -6px; + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + border-left-width: 6px; + border-left-style: solid; + border-left-color: #817cce +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.out .msg-out { + margin-right: 55px; + text-align: right +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.out .msg-out .arrow { + display: block; + position: absolute; + top: 9px; + right: -6px; + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + border-left-width: 6px; + border-left-style: solid; + border-left-color: #36424c +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.out .datetime, +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-messages .post.out .name { + text-align: right; + color: white; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-user .chat-sidebar-chat-user-form { + padding: 20px 10px 15px +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-alerts .chat-sidebar-alerts-list { + padding: 10px 0; + position: relative +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-settings .chat-sidebar-settings-list { + padding: 0; + position: relative; + background: #ffffff; + border-left: 1px solid #e9e9e9; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-settings .chat-sidebar-settings-list .list-items li .bootstrap-switch { + margin-top: -3px; + float: right; + border: 0; + min-width: 59px; + border: 1px solid #ddd; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-settings .chat-sidebar-settings-list .list-items li .form-control { + width: 75px !important; + padding: 4px !important; + float: right; + border: 0; + margin-top: -4px; + border: 1px solid #ddd; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-settings .chat-sidebar-settings-list .list-items li select.form-control { + padding: 4px 0 !important; + border: 1px solid #ddd; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .dot { + width: 12px; + height: 12px; + display: inline-block; + position: absolute; + border-radius: 50%; + left: 37px; + border: 2px solid #fff; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .online { + background: #5cc691; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .offline { + background: #bfbfbf; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .away { + background: #ffd200; +} +.chat-sidebar-container .chat-sidebar .chat-sidebar-chat .chat-sidebar-chat-users .media-list .media .busy { + background: #ff6a6a; +} +.chat-txt-form .form-group { + float: left; + width: 83%; +} +.chat-sidebar-container .chat-sidebar { + border: 1px solid #80808036; +} +.chat-box-submit { + width: 100%; +} +.post { + padding: 50px 0; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); +} +.post.single { + border-bottom: none; +} +.post:first-child { + padding-top: 0; +} +.post .entry-title { + font-size: 30px; + font-size: 2.1428571429em; + font-weight: 300; + color: white; +} +.post .featured-image { + margin-bottom: 20px; +} +.post .featured-image img { + width: 100%; + max-width: 100%; + height: auto; + border-radius: 5px; + display: block; +} +.post p { + margin-bottom: 30px; +} +.notification-icon { + width: 36px; + height: 36px; + text-align: center; + display: inline-block; + vertical-align: middle; + font-size: 15px; + color: #fff; + line-height: 1.2; + padding: 9px 0; + margin-right: 5px; +} +.settings-list .setting-item { + border-bottom: 1px solid #eee; + padding: 15px; + overflow: hidden; +} +.settings-list .setting-item .setting-text { + float: left; + font-size: 13px; +} +.settings-list .setting-item .setting-set { + float: right; +} +/****************************************************************** + + [13. CARD BOX STYLE ] + +*********************************************************************/ + +.card { + position: relative; + margin-bottom: 24px; + margin-top: 10px; + background-color: #ffffff; + border-radius: 3px; + -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.33); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.33); +} +.card-topline-yellow { + border-top: 3px solid #F39C12; +} +.card-topline-aqua { + border-top: 3px solid #00C0EF; +} +.card-topline-lightblue { + border-top: 3px solid #3C8DBC; +} +.card-topline-orange +{ + border-top: 3px solid #f08627; +} +.card-topline-green { + border-top: 3px solid #00A65A; +} +.card-topline-red { + border-top: 3px solid #DD4B39; +} +.card-topline-purple { + border-top: 3px solid #ad5bff; +} +.card-topline-gray { + border-top: 3px solid #ddd; +} +.card:before, +.card:after { + content: " "; + display: table; +} +.card:after { + clear: both; +} +.card > .nano:last-child { + border-radius: 0 0 2px 2px; +} +.card.no-shadow { + -webkit-box-shadow: none; + box-shadow: none; +} +.card-head { + border-radius: 2px 2px 0 0; + border-bottom: 1px dotted rgba(0, 0, 0, 0.2); + padding: 2px; + text-transform: uppercase; + color: #3a405b; + font-size: 14px; + font-weight: bold; + line-height: 40px; + min-height: 40px; +} +.card-head:before, +.card-head:after { + content: " "; + display: table; +} +.card-head:after { + clear: both; +} +.card-head header { + display: inline-block; + padding: 11px 24px; + vertical-align: middle; + line-height: 17px; + font-size: 16px; +} +.card-head header > h1, +.card-head header > h2, +.card-head header > h3, +.card-head header > h4, +.card-head header > h5, +.card-head header > h6 { + vertical-align: middle; + margin: 0; + line-height: 1; +} +.card-head header small { + color: inherit; + opacity: 0.6; + font-size: 75%; +} +.card-head > div { + display: inline-block; +} +.card-head .tools { + padding-right: 16px; + float: right; + margin-top: 7px; + margin-bottom: 7px; + margin-left: 24px; + line-height: normal; + vertical-align: middle; +} +.card-head .tools .btn { + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid transparent; + padding: 0px 2px; + font-size: 12px; + background: transparent; +} +.card-head .tools .btn-color { + color: #97a0b3; + margin-right: 3px; + font-size: 12px; +} +.card-head .tools .btn-color:hover { + color: black; +} +.card-head.card-head-xs header { + font-size: 15px; +} +.card-head.card-head-sm header { + font-size: 15px; +} +.card-head.card-head-lg header { + font-size: 24px; +} +.card-body { + padding: 10px 24px 24px 24px; + position: relative; +} +.card-body:before, +.card-body:after { + content: " "; + display: table; +} +.card-body:after { + clear: both; +} +.card-body:last-child { + border-radius: 0 0 2px 2px; +} +.card-body.table-responsive { + margin: 0; +} +.card-actionbar { + padding-bottom: 8px; + position: relative; +} +.card-actionbar:before, +.card-actionbar:after { + content: " "; + display: table; +} +.card-actionbar:after { + clear: both; +} +.card-actionbar:last-child { + border-radius: 0 0 2px 2px; +} +.card-actionbar-row { + padding: 6px 16px; + text-align: right; +} +.card-tiles > .row, +.card-type-blog-masonry > .row { + margin: 0; +} +.card-tiles > .row > [class^="col-"], +.card-type-blog-masonry > .row > [class^="col-"] { + padding: 0; +} +.card-underline .card-head { + border-bottom: 1px solid rgba(150, 156, 156, 0.4); +} +.card-underline .card-foot { + border-top: 1px solid rgba(150, 156, 156, 0.4); +} +.card-bordered, +.card-outlined { + border: 2px solid #969c9c; +} +.cardbox:hover { + box-shadow: 0 1px 5px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); + transition: all 150ms linear; +} +.cardbox { + background: #fff; + min-height: 50px; + position: relative; + margin-bottom: 20px; + transition: .5s; + border: 1px solid #f2f2f2; + display: inline-block; + position: relative; + width: 100%; + border-radius: 4px; + color: rgba(0, 0, 0, 0.87); + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} +.cardbox .header { + color: #555; + padding: 0 0 10px 0; + position: relative; + border-bottom: 1px solid rgba(204, 204, 204, 0.8); + box-shadow: none; + margin-bottom: 0; + margin: 15px; + border-radius: 4px; + padding: 15px 0; + background-color: #fff; +} +.cardbox .header h2 { + margin: 0; + font-size: 16px; + font-weight: 700; + color: #3a405b; + text-transform: uppercase; +} +.cardbox .body { + font-size: 15px; + padding: 15px; + font-weight: 400; +} +.card-box { + background: #fff; + min-height: 50px; + box-shadow: none; + position: relative; + margin-bottom: 20px; + transition: .5s; + border: 1px solid #f2f2f2; + border-radius: 0; +} +.card-box:hover { + /* box-shadow: 0 1px 5px 1px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); + transition: all 150ms linear; */ + -webkit-transform: translateY(-6px); + transform: translateY(-6px); + box-shadow: 0 20px 20px rgba(0,0,0,.1); + -moz-box-shadow: 0 20px 20px rgba(0,0,0,.1); + -webkit-box-shadow: 0 20px 20px rgba(0,0,0,.1); +} + +/************************************************************************* + + [14. PROFILE ] + +**************************************************************************/ + +.doctor-pic { + padding: 3px; + border: 3px solid rgb(210, 214, 222); + border-radius: 50% 50% 50% 50%; + max-width: 112px; +} +.doctor-profile { + float: left; + width: 100%; + text-align: center; +} +.doctor-name { + padding: 3px; + font-weight: bold; + font-size: 22px; + text-align: center; +} +#biography { + padding: 0 20px; +} +.center { + text-align: center; +} +.white-box { + background: #ffffff; + padding: 25px; + margin-top: 10px; + margin-bottom: 15px; +} +.patient-profile { + height: 100%; + width: 100%; +} +.profile-sidebar { + float: left; + width: 350px; + margin-right: 20px; +} +.profile-content { + overflow: hidden; +} +.profile-userpic img { + margin: 0px auto; + width: 130px; + padding: 3px; + border: 3px solid rgb(210, 214, 222); + border-radius: 50% 50% 50% 50%; +} +.profile-usertitle { + text-align: center; + margin-top: 5px; +} +.profile-usertitle-name { + font-size: 20px; + margin-bottom: 2px; + font-weight: bold; + color: #3a405b; +} +.profile-usertitle-job { + color: #777777; + font-size: 12px; + margin-bottom: 5px; +} +.profile-userbuttons { + text-align: center; + margin-top: 10px; +} +.profile-userbuttons .btn { + margin-right: 5px; +} +.profile-userbuttons .btn:last-child { + margin-right: 0; +} +.profile-userbuttons button { + text-transform: uppercase; + font-size: 11px; + font-weight: 600; + padding: 6px 15px; +} +.profile-usermenu { + margin-top: 30px; + padding-bottom: 20px; +} +.profile-usermenu ul li { + border-bottom: 1px solid #f0f4f7; +} +.profile-usermenu ul li:last-child { + border-bottom: none; +} +.profile-usermenu ul li a { + color: #93a3b5; + font-size: 16px; + font-weight: 400; +} +.profile-usermenu ul li a i { + margin-right: 8px; + font-size: 16px; +} +.profile-usermenu ul li a:hover { + background-color: #fafcfd; + color: #5b9bd1; +} +.profile-usermenu ul li.active a { + color: #5b9bd1; + background-color: #f6f9fb; + border-left: 2px solid #5b9bd1; + margin-left: -2px; +} +.profile-stat { + padding-bottom: 20px; + border-bottom: 1px solid #f0f4f7; +} +.profile-stat-title { + color: #7f90a4; + font-size: 25px; + text-align: center; +} +.profile-stat-text { + color: #5b9bd1; + font-size: 11px; + font-weight: 800; + text-align: center; +} +.profile-desc-title { + color: #7f90a4; + font-size: 17px; + font-weight: 600; +} +.profile-desc-text { + color: #7e8c9e; + font-size: 14px; +} +.profile-desc-link i { + width: 22px; + font-size: 19px; + color: #abb6c4; + margin-right: 5px; +} +.profile-desc-link a { + font-size: 14px; + font-weight: 600; + color: #5b9bd1; +} +.profile-tabname { + font-size: 12px; + text-transform: capitalize; + font-weight: normal; +} +.thumb-lg { + width: 33%; +} +.img-responsive { + display: block; + max-width: 100%; + height: auto; +} +.blogThumb { + padding: 4px; + margin-bottom: 20px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; +} +.thumb-center{ + text-align: center; +} +.thumb-center img{ + display: inline-block; +} +.border-gray { + border: 1px solid #ddd; +} +.list-group-unbordered > .list-group-item { + border-left: 0px none; + border-right: 0px none; + border-radius: 0px 0px 0px 0px; + padding-left: 0px; + padding-right: 0px; +} +.list-group .list-group-item { + display: block; +} +.profile-desc { + text-align: left; + margin-top: 10px; + margin-bottom: 25px; +} +.profile-desc-item { + text-align: left; + font-size: 14px; + color: #6f6d6d; + width: 100px; +} +.performance-list { + list-style: none outside none; + padding: 0px; +} +.performance-list li a { + color: rgb(158, 158, 158); + margin-bottom: 10px; + display: block; + text-decoration: none; +} +.performance-list li a:hover { + color: #00C0EF; +} +.work-monitor .title { + margin: 0 0 40px 0; +} +.work-monitor .title h3 { + font-size: 14px; + text-transform: uppercase; + color: #555; + margin: 20px 0 10px 0; +} +.work-monitor .title p { + font-size: 14px; + color: #b1b5b7; +} +.work-monitor .states { + width: 90%; +} +.work-monitor .states .info { + display: inline-block; + width: 100%; + font-size: 13px; +} +.work-progress .states { + width: 100%; +} +.p-text-area, +.p-text-area:focus { + box-shadow: none; + color: #C3C3C3; + font-size: 16px; + font-weight: 300; + border: 2px solid #f5f5f5; +} +ul.activity-list { + list-style-type: none; + padding: 0; +} +ul.activity-list li { + display: inline-block; + width: 100%; + margin-bottom: 30px; + padding-bottom: 20px; + border-bottom: 1px solid #eff0f4; +} +ul.activity-list .avatar img { + float: left; + width: 50px; + height: 50px; + border-radius: 50%; + -webkit-border-radius: 50%; +} +ul.activity-list .activity-desk { + margin-left: 70px; +} +ul.activity-list .activity-desk h5 { + color: #2a323f; +} +ul.activity-list .activity-desk h5 a { + font-weight: bold; +} +.activity-desk .album a { + float: left; + margin-right: 10px; + width: 170px; + height: 110px; + overflow: hidden; + margin-bottom: 10px; +} +.activity-desk .album a img { + width: 100%; +} +#map-canvas { + height: 200px; + width: 100%; +} +.revenue-graph { + height: 220px; +} +/********************************************************** + + [15. WIZARD ] + +***********************************************************/ + +.sw-toolbar-top, +.sw-toolbar-bottom{ + flex-direction: row-reverse; + padding-top: 15px; +} +.sw-toolbar-top .navbar-btn .btn{ + margin-left: 10px; +} +.sw-toolbar-bottom .navbar-btn .btn{ + margin-left: 10px; +} +.wizard-form .navbar-btn .btn{ + margin-left: 10px; +} +.wizard-form .form-group{ + padding-right: 20px; +} + +.checkbox-list>label { + display: block +} +.checkbox-list>label.checkbox-inline { + display: inline-block +} + +.sw-main .nav-tabs>li { + width: 25%; +} +.sw-main.sw-theme-circles .nav-tabs>li { + width: calc(25% - 40px); +} +/**************************************************************** + + [16. TABLE ] + +*****************************************************************/ + +.table-scrollable { + width: 100%; + overflow-x: auto; + overflow-y: hidden; + border: 1px solid #e7ecf1; + margin: 10px 0!important +} +.DTS .table-scrollable, +.table-scrollable.table-scrollable-borderless, +.table-scrollable>.table-bordered { + border: 0 +} +.table-scrollable>.table-bordered>tbody>tr:last-child>td, +.table-scrollable>.table-bordered>tbody>tr:last-child>th, +.table-scrollable>.table-bordered>tfoot>tr:last-child>td, +.table-scrollable>.table-bordered>tfoot>tr:last-child>th, +.table-scrollable>.table-bordered>thead>tr:last-child>td, +.table-scrollable>.table-bordered>thead>tr:last-child>th, +.table.table-bordered thead>tr>th { + border-bottom: 0 +} +.table-scrollable>.table { + width: 100%!important; + margin: 0!important; + background-color: #fff +} +.table-scrollable>.table>tbody>tr>th, +.table-scrollable>.table>tfoot>tr>td, +.table-scrollable>.table>tfoot>tr>th, +.table-scrollable>.table>thead>tr>th { + white-space: nowrap +} +.table-scrollable>.table-bordered>tbody>tr>td:first-child, +.table-scrollable>.table-bordered>tbody>tr>th:first-child, +.table-scrollable>.table-bordered>tfoot>tr>td:first-child, +.table-scrollable>.table-bordered>tfoot>tr>th:first-child, +.table-scrollable>.table-bordered>thead>tr>td:first-child, +.table-scrollable>.table-bordered>thead>tr>th:first-child { + border-left: 0 +} +.table-scrollable>.table-bordered>tbody>tr>td:last-child, +.table-scrollable>.table-bordered>tbody>tr>th:last-child, +.table-scrollable>.table-bordered>tfoot>tr>td:last-child, +.table-scrollable>.table-bordered>tfoot>tr>th:last-child, +.table-scrollable>.table-bordered>thead>tr>td:last-child, +.table-scrollable>.table-bordered>thead>tr>th:last-child { + border-right: 0 +} +.table td, +.table th, +.card .table td, +.card .table th, +.card .dataTable td, +.card .dataTable th { + padding: 15px 8px; + vertical-align: middle; +} +.table td.valigntop { + vertical-align: top; +} +.table-toolbar { + margin-bottom: 20px +} +.table-toolbar:after, +.table-toolbar:before { + content: " "; + display: table +} +.table-toolbar:after { + clear: both +} +.table.table-full-width { + width: 100%!important +} +.table .btn { + margin-left: 0; + margin-right: 5px +} +.table thead tr th { + font-size: 14px; + font-weight: 600 +} +.table-advance { + margin-bottom: 10px!important +} +.table-advance thead { + color: #3f444a +} +.table-advance thead tr th { + background-color: #f1f4f7; + font-size: 14px; + font-weight: 400; + color: #3f444a +} +.table-advance div.danger, +.table-advance div.important, +.table-advance div.info, +.table-advance div.success, +.table-advance div.warning { + position: absolute; + margin-top: -5px; + float: left; + width: 2px; + height: 30px; + margin-right: 20px!important +} +.table-advance tr td { + border-left-width: 0 +} +.table-advance tr td:first-child { + border-left-width: 2px!important +} +.table-advance tr td.highlight:first-child a { + margin-left: 15px +} +.table-advance td.highlight div.primary { + border-left: 2px solid #337ab7 +} +.table-advance td.highlight div.success { + border-left: 2px solid #36c6d3 +} +.table-advance td.highlight div.info { + border-left: 2px solid #659be0 +} +.table-advance td.highlight div.warning { + border-left: 2px solid #F1C40F +} +.table-advance td.highlight div.danger { + border-left: 2px solid #ed6b75 +} +.table.table-light { + border: 0!important +} +.table.table-light>thead>tr:hover>th { + background: 0 0 +} +.table.table-light>thead>tr.uppercase { + text-transform: uppercase +} +.table.table-light>thead>tr>th { + font-weight: 600; + font-size: 13px; + color: #93a2a9; + font-family: Roboto,sans-serif; + border: 0; + border-bottom: 1px solid #F2F5F8 +} +.table.table-light>tbody>tr:last-child>td { + border: 0 +} +.table.table-light>tbody>tr>td { + border: 0; + border-bottom: 1px solid #F2F5F8; + color: #8896a0; + vertical-align: middle +} +.table.table-light>tbody>tr>td.fit { + width: 1px; + padding-right: 3px +} +.table.table-light>tbody>tr>td .user-pic { + display: inline-block; + vertical-align: middle; + height: 30px; + -webkit-border-radius: 100%; + -moz-border-radius: 100%; + -ms-border-radius: 100%; + -o-border-radius: 100%; + border-radius: 100% +} +.table.table-light.table-hover>tbody>tr:hover>td, +.table.table-light.table-hover>tbody>tr>td:hover, +.table.table-light.table-hover>tbody>tr>th:hover { + background: #f9fafb!important +} +.table-hover>tbody>tr:hover, +.table-hover>tbody>tr:hover>td { + background: #f3f4f6!important +} +table.dataTable tbody td.patient-img { + padding: 2px; +} +table.valign-middle tbody tr td { + vertical-align: middle; +} +/********************************************************************* + + [17. BUTTON ] + +**********************************************************************/ + +.btn { + outline: 0!important +} +.btn:hover { + transition: all .3s +} + +.btn-default, +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.btn-default.focus, +.btn-default:active, +.btn-default:focus, +.btn-default:hover, +.open > .dropdown-toggle.btn-default, +.btn-default.active.focus, +.btn-default.active:focus, +.btn-default.active:hover, +.btn-default:active.focus, +.btn-default:active:focus, +.btn-default:active:hover, +.open > .dropdown-toggle.btn-default.focus, +.open > .dropdown-toggle.btn-default:focus, +.open > .dropdown-toggle.btn-default:hover { + background-color: #e1e5ec !important; + border-color: #e1e5ec !important; +} +.btn-primary { + background-color: #188ae2 !important; + border: 1px solid #188ae2 !important; + color: #fff !important; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.focus, +.btn-primary:active, +.btn-primary:focus, +.btn-primary:hover, +.open > .dropdown-toggle.btn-primary { + background-color: #167ccb !important; + border: 1px solid #167ccb !important; + color: #fff !important; +} +.btn-success { + background-color: #4bd396 !important; + border: 1px solid #4bd396 !important; + color: #fff !important; +} +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.focus, +.btn-success:active, +.btn-success:focus, +.btn-success:hover, +.open > .dropdown-toggle.btn-success { + background-color: #37ce8a !important; + border: 1px solid #37ce8a !important; + color: #fff !important; +} +.btn-info { + background-color: #3ac9d6 !important; + border: 1px solid #3ac9d6 !important; + color: #fff !important; +} +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.focus, +.btn-info:active, +.btn-info:focus, +.btn-info:hover, +.open > .dropdown-toggle.btn-info { + background-color: #2abfcc !important; + border: 1px solid #2abfcc !important; + color: #fff !important; +} +.btn-warning { + background-color: #f9c851 !important; + border: 1px solid #f9c851 !important; + color: #fff !important; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.focus, +.btn-warning:active, +.btn-warning:focus, +.btn-warning:hover, +.open > .dropdown-toggle.btn-warning { + background-color: #f8c038 !important; + border: 1px solid #f8c038 !important; + color: #fff !important; +} +.btn-danger { + background-color: #f5707a !important; + border: 1px solid #f5707a !important; + color: #fff !important; +} +.btn-danger:active, +.btn-danger:focus, +.btn-danger:hover, +.btn-danger.active, +.btn-danger.focus, +.btn-danger:active, +.btn-danger:focus, +.btn-danger:hover, +.open > .dropdown-toggle.btn-danger { + background-color: #f35864 !important; + border: 1px solid #f35864 !important; + color: #fff !important; +} + +.btn-pink { + background-color: #ff4081 !important; + border: 1px solid #ff4081 !important; + color: #fff !important; +} +.btn-pink:active, +.btn-pink:focus, +.btn-pink:hover, +.btn-pink.active, +.btn-pink.focus, +.btn-pink:active, +.btn-pink:focus, +.btn-pink:hover, +.open > .dropdown-toggle.btn-pink { + background-color: #ff4081 !important; + border: 1px solid #ff4081 !important; + color: #fff !important; +} + + +/* .btn.btn-default { + color: #666; + background-color: #e1e5ec; + border-color: #e1e5ed; +} +.btn.btn-default:hover { + color: #666; + background-color: #c2cad8; + border-color: #bcc5d4; +} +.btn-primary { + background-color: #4489e4; + border-color: #4489e4; + color: #FFFFFF; +} +.btn-info { + background-color: #34d3eb !important; + border: 1px solid #34d3eb !important; +} +.btn-warning { + background-color: #ffa91c !important; + border: 1px solid #ffa91c !important; +} +.btn-success { + background-color: #32c861 !important; + border: 1px solid #32c861 !important; +} +.btn-danger { + background-color: #f96a74 !important; + border: 1px solid #f96a74 !important; +} */ +.btn:hover, +.icon-btn:hover, +.btn-group>.btn:hover { + box-shadow: 0 3px 6px rgba(0, 0, 0, .2), 0 3px 6px rgba(0, 0, 0, .26) +} +.btn:active { + box-shadow: 0 14px 28px rgba(0, 0, 0, .26), 0 10px 10px rgba(0, 0, 0, .22) +} +.btn:not(.btn-sm):not(.btn-lg) {} .btn.white:not(.btn-outline) { + color: #666; + background-color: #fff; + border-color: #fbfbfb; +} +.btn.white:not(.btn-outline).focus, +.btn.white:not(.btn-outline):focus { + color: #666; + background-color: #e6e6e6; + border-color: #bfbfbf +} +.btn.white:not(.btn-outline).active, +.btn.white:not(.btn-outline):active, +.btn.white:not(.btn-outline):hover, +.open>.btn.white:not(.btn-outline).dropdown-toggle { + color: #666; + background-color: #e6e6e6; + border-color: #e0e0e0 +} +.btn.white:not(.btn-outline).active.focus, +.btn.white:not(.btn-outline).active:focus, +.btn.white:not(.btn-outline).active:hover, +.btn.white:not(.btn-outline):active.focus, +.btn.white:not(.btn-outline):active:focus, +.btn.white:not(.btn-outline):active:hover, +.open>.btn.white:not(.btn-outline).dropdown-toggle.focus, +.open>.btn.white:not(.btn-outline).dropdown-toggle:focus, +.open>.btn.white:not(.btn-outline).dropdown-toggle:hover { + color: #666; + background-color: #d4d4d4; + border-color: #bfbfbf +} +.btn.white:not(.btn-outline).disabled.focus, +.btn.white:not(.btn-outline).disabled:focus, +.btn.white:not(.btn-outline).disabled:hover, +.btn.white:not(.btn-outline)[disabled].focus, +.btn.white:not(.btn-outline)[disabled]:focus, +.btn.white:not(.btn-outline)[disabled]:hover, +fieldset[disabled] .btn.white:not(.btn-outline).focus, +fieldset[disabled] .btn.white:not(.btn-outline):focus, +fieldset[disabled] .btn.white:not(.btn-outline):hover { + background-color: #fff; + border-color: #fbfbfb; +} +.btn.white:not(.btn-outline) .badge { + color: #fff; + background-color: #666 +} +.btn.btn-outline.white { + border-color: #fff; + color: #fff; + background: 0 0 +} +.btn.btn-outline.white.active, +.btn.btn-outline.white:active, +.btn.btn-outline.white:active:focus, +.btn.btn-outline.white:active:hover, +.btn.btn-outline.white:focus, +.btn.btn-outline.white:hover { + border-color: #fff; + color: #666; + background-color: #fbfbfb +} +.btn.white-stripe { + border-left: 4px solid #fff!important +} +.btn.white.btn-no-border:not(.active) { + border-color: transparent +} +.btn.default:not(.btn-outline) { + color: #666; + background-color: #e1e5ec; + border-color: #e1e5ed +} +.btn.default:not(.btn-outline).focus, +.btn.default:not(.btn-outline):focus { + color: #666; + background-color: #c2cad8; + border-color: #93a1bb +} +.btn.default:not(.btn-outline).active, +.btn.default:not(.btn-outline):active, +.btn.default:not(.btn-outline):hover, +.open>.btn.default:not(.btn-outline).dropdown-toggle { + color: #666; + background-color: #c2cad8; + border-color: #bcc5d4 +} +.btn.default:not(.btn-outline).active.focus, +.btn.default:not(.btn-outline).active:focus, +.btn.default:not(.btn-outline).active:hover, +.btn.default:not(.btn-outline):active.focus, +.btn.default:not(.btn-outline):active:focus, +.btn.default:not(.btn-outline):active:hover, +.open>.btn.default:not(.btn-outline).dropdown-toggle.focus, +.open>.btn.default:not(.btn-outline).dropdown-toggle:focus, +.open>.btn.default:not(.btn-outline).dropdown-toggle:hover { + color: #666; + background-color: #acb7ca; + border-color: #93a1bb +} +.btn.default:not(.btn-outline).active, +.btn.default:not(.btn-outline):active, +.open>.btn.default:not(.btn-outline).dropdown-toggle { + background-image: none +} +.btn.default:not(.btn-outline).disabled.focus, +.btn.default:not(.btn-outline).disabled:focus, +.btn.default:not(.btn-outline).disabled:hover, +.btn.default:not(.btn-outline)[disabled].focus, +.btn.default:not(.btn-outline)[disabled]:focus, +.btn.default:not(.btn-outline)[disabled]:hover, +fieldset[disabled] .btn.default:not(.btn-outline).focus, +fieldset[disabled] .btn.default:not(.btn-outline):focus, +fieldset[disabled] .btn.default:not(.btn-outline):hover { + background-color: #e1e5ec; + border-color: #e1e5ed; +} +.btn.default:not(.btn-outline) .badge { + color: #e1e5ec; + background-color: #666 +} +.btn.btn-outline.default { + border-color: #e1e5ec; + color: #e1e5ec; + background: 0 0 +} +.btn.btn-outline.default.active, +.btn.btn-outline.default:active, +.btn.btn-outline.default:active:focus, +.btn.btn-outline.default:active:hover, +.btn.btn-outline.default:focus, +.btn.btn-outline.default:hover { + border-color: #e1e5ec; + color: #666; + background-color: #e1e5ed +} +.btn.default-stripe { + border-left: 4px solid #e1e5ec!important +} +.btn.default.btn-no-border:not(.active) { + border-color: transparent +} +.btn.dark:not(.btn-outline) { + color: #FFF; + background-color: #2f353b; + border-color: #2f353c +} +.btn.dark:not(.btn-outline).focus, +.btn.dark:not(.btn-outline):focus { + color: #FFF; + background-color: #181c1f; + border-color: #000 +} +.btn.dark:not(.btn-outline).active, +.btn.dark:not(.btn-outline):active, +.btn.dark:not(.btn-outline):hover, +.open>.btn.dark:not(.btn-outline).dropdown-toggle { + color: #FFF; + background-color: #181c1f; + border-color: #141619 +} +.btn.dark:not(.btn-outline).active.focus, +.btn.dark:not(.btn-outline).active:focus, +.btn.dark:not(.btn-outline).active:hover, +.btn.dark:not(.btn-outline):active.focus, +.btn.dark:not(.btn-outline):active:focus, +.btn.dark:not(.btn-outline):active:hover, +.open>.btn.dark:not(.btn-outline).dropdown-toggle.focus, +.open>.btn.dark:not(.btn-outline).dropdown-toggle:focus, +.open>.btn.dark:not(.btn-outline).dropdown-toggle:hover { + color: #FFF; + background-color: #090a0b; + border-color: #000 +} +.btn.dark:not(.btn-outline).active, +.btn.dark:not(.btn-outline):active, +.open>.btn.dark:not(.btn-outline).dropdown-toggle { + background-image: none +} +.btn.dark:not(.btn-outline).disabled.focus, +.btn.dark:not(.btn-outline).disabled:focus, +.btn.dark:not(.btn-outline).disabled:hover, +.btn.dark:not(.btn-outline)[disabled].focus, +.btn.dark:not(.btn-outline)[disabled]:focus, +.btn.dark:not(.btn-outline)[disabled]:hover, +fieldset[disabled] .btn.dark:not(.btn-outline).focus, +fieldset[disabled] .btn.dark:not(.btn-outline):focus, +fieldset[disabled] .btn.dark:not(.btn-outline):hover { + background-color: #2f353b; + border-color: #2f353c +} +.btn.dark:not(.btn-outline) .badge { + color: #2f353b; + background-color: #FFF +} +.btn.btn-outline.dark { + border-color: #2f353b; + color: #2f353b; + background: 0 0 +} +.btn.btn-outline.dark.active, +.btn.btn-outline.dark:active, +.btn.btn-outline.dark:active:focus, +.btn.btn-outline.dark:active:hover, +.btn.btn-outline.dark:focus, +.btn.btn-outline.dark:hover { + border-color: #2f353b; + color: #FFF; + background-color: #2f353c +} +.btn.dark-stripe { + border-left: 4px solid #2f353b!important +} +.btn.dark.btn-no-border:not(.active) { + border-color: transparent +} +.btn.blue:not(.btn-outline) { + color: #FFF; + background-color: #3598dc; + border-color: #3598dd +} +.btn.blue:not(.btn-outline).focus, +.btn.blue:not(.btn-outline):focus { + color: #FFF; + background-color: #217ebd; + border-color: #15527c +} +.btn.blue:not(.btn-outline).active, +.btn.blue:not(.btn-outline):active, +.btn.blue:not(.btn-outline):hover, +.open>.btn.blue:not(.btn-outline).dropdown-toggle { + color: #FFF; + background-color: #217ebd; + border-color: #1f78b5 +} +.btn.blue:not(.btn-outline).active.focus, +.btn.blue:not(.btn-outline).active:focus, +.btn.blue:not(.btn-outline).active:hover, +.btn.blue:not(.btn-outline):active.focus, +.btn.blue:not(.btn-outline):active:focus, +.btn.blue:not(.btn-outline):active:hover, +.open>.btn.blue:not(.btn-outline).dropdown-toggle.focus, +.open>.btn.blue:not(.btn-outline).dropdown-toggle:focus, +.open>.btn.blue:not(.btn-outline).dropdown-toggle:hover { + color: #FFF; + background-color: #1c699f; + border-color: #15527c +} +.btn.blue:not(.btn-outline).active, +.btn.blue:not(.btn-outline):active, +.open>.btn.blue:not(.btn-outline).dropdown-toggle { + background-image: none +} +.btn.blue:not(.btn-outline).disabled.focus, +.btn.blue:not(.btn-outline).disabled:focus, +.btn.blue:not(.btn-outline).disabled:hover, +.btn.blue:not(.btn-outline)[disabled].focus, +.btn.blue:not(.btn-outline)[disabled]:focus, +.btn.blue:not(.btn-outline)[disabled]:hover, +fieldset[disabled] .btn.blue:not(.btn-outline).focus, +fieldset[disabled] .btn.blue:not(.btn-outline):focus, +fieldset[disabled] .btn.blue:not(.btn-outline):hover { + background-color: #3598dc; + border-color: #3598dd +} +.btn.blue:not(.btn-outline) .badge { + color: #3598dc; + background-color: #FFF +} +.btn.btn-outline.blue { + border-color: #3598dc; + color: #3598dc; + background: 0 0 +} +.btn.btn-outline.blue.active, +.btn.btn-outline.blue:active, +.btn.btn-outline.blue:active:focus, +.btn.btn-outline.blue:active:hover, +.btn.btn-outline.blue:focus, +.btn.btn-outline.blue:hover { + border-color: #3598dc; + color: #FFF; + background-color: #3598dd +} +.btn.green-bgcolor:not(.btn-outline) { + color: #FFF; + background-color: #69C2FE; + border-color: #69C2FF +} +.btn.green-bgcolor:not(.btn-outline).focus, +.btn.green-bgcolor:not(.btn-outline):focus { + color: #FFF; + background-color: #26a1ab; + border-color: #18666d +} +.btn.green-bgcolor:not(.btn-outline).active, +.btn.green-bgcolor:not(.btn-outline):active, +.btn.green-bgcolor:not(.btn-outline):hover, +.open>.btn.green-bgcolor:not(.btn-outline).dropdown-toggle { + color: #FFF; + background-color: #69C2FE; + border-color: #69C2FF; +} +.btn.green-bgcolor:not(.btn-outline).active.focus, +.btn.green-bgcolor:not(.btn-outline).active:focus, +.btn.green-bgcolor:not(.btn-outline).active:hover, +.btn.green-bgcolor:not(.btn-outline):active.focus, +.btn.green-bgcolor:not(.btn-outline):active:focus, +.btn.green-bgcolor:not(.btn-outline):active:hover, +.open>.btn.green-bgcolor:not(.btn-outline).dropdown-toggle.focus, +.open>.btn.green-bgcolor:not(.btn-outline).dropdown-toggle:focus, +.open>.btn.green-bgcolor:not(.btn-outline).dropdown-toggle:hover { + color: #FFF; + background-color: #1f858e; + border-color: #18666d +} +.btn.green-bgcolor:not(.btn-outline).active, +.btn.green-bgcolor:not(.btn-outline):active, +.open>.btn.green-bgcolor:not(.btn-outline).dropdown-toggle { + background-image: none +} +.btn.green-bgcolor:not(.btn-outline).disabled.focus, +.btn.green-bgcolor:not(.btn-outline).disabled:focus, +.btn.green-bgcolor:not(.btn-outline).disabled:hover, +.btn.green-bgcolor:not(.btn-outline)[disabled].focus, +.btn.green-bgcolor:not(.btn-outline)[disabled]:focus, +.btn.green-bgcolor:not(.btn-outline)[disabled]:hover, +fieldset[disabled] .btn.green-bgcolor:not(.btn-outline).focus, +fieldset[disabled] .btn.green-bgcolor:not(.btn-outline):focus, +fieldset[disabled] .btn.green-bgcolor:not(.btn-outline):hover { + background-color: #32c5d2; + border-color: #32c5d3 +} +.btn.green-bgcolor:not(.btn-outline) .badge { + color: #32c5d2; + background-color: #FFF +} +.btn.grey:not(.btn-outline) { + color: #333; + background-color: #E5E5E5; + border-color: #E5E5E6 +} +.btn.grey:not(.btn-outline).focus, +.btn.grey:not(.btn-outline):focus { + color: #333; + background-color: #ccc; + border-color: #a5a5a5 +} +.btn.grey:not(.btn-outline).active, +.btn.grey:not(.btn-outline):active, +.btn.grey:not(.btn-outline):hover, +.open>.btn.grey:not(.btn-outline).dropdown-toggle { + color: #333; + background-color: #ccc; + border-color: #c6c6c6 +} +.btn.grey:not(.btn-outline).active.focus, +.btn.grey:not(.btn-outline).active:focus, +.btn.grey:not(.btn-outline).active:hover, +.btn.grey:not(.btn-outline):active.focus, +.btn.grey:not(.btn-outline):active:focus, +.btn.grey:not(.btn-outline):active:hover, +.open>.btn.grey:not(.btn-outline).dropdown-toggle.focus, +.open>.btn.grey:not(.btn-outline).dropdown-toggle:focus, +.open>.btn.grey:not(.btn-outline).dropdown-toggle:hover { + color: #333; + background-color: #bababa; + border-color: #a5a5a5 +} +.btn.grey:not(.btn-outline).active, +.btn.grey:not(.btn-outline):active, +.open>.btn.grey:not(.btn-outline).dropdown-toggle { + background-image: none +} +.btn.grey:not(.btn-outline).disabled.focus, +.btn.grey:not(.btn-outline).disabled:focus, +.btn.grey:not(.btn-outline).disabled:hover, +.btn.grey:not(.btn-outline)[disabled].focus, +.btn.grey:not(.btn-outline)[disabled]:focus, +.btn.grey:not(.btn-outline)[disabled]:hover, +fieldset[disabled] .btn.grey:not(.btn-outline).focus, +fieldset[disabled] .btn.grey:not(.btn-outline):focus, +fieldset[disabled] .btn.grey:not(.btn-outline):hover { + background-color: #E5E5E5; + border-color: #E5E5E6 +} +.btn.grey:not(.btn-outline) .badge { + color: #E5E5E5; + background-color: #333 +} +.btn.btn-outline.grey { + border-color: #E5E5E5; + color: #E5E5E5; + background: 0 0 +} +.btn.btn-outline.grey.active, +.btn.btn-outline.grey:active, +.btn.btn-outline.grey:active:focus, +.btn.btn-outline.grey:active:hover, +.btn.btn-outline.grey:focus, +.btn.btn-outline.grey:hover { + border-color: #E5E5E5; + color: #333; + background-color: #E5E5E6 +} +.btn.red:not(.btn-outline) { + color: #fff; + background-color: #e7505a; + border-color: #e7505b +} +.btn.red:not(.btn-outline).focus, +.btn.red:not(.btn-outline):focus { + color: #fff; + background-color: #e12330; + border-color: #a1161f +} +.btn.red:not(.btn-outline).active, +.btn.red:not(.btn-outline):active, +.btn.red:not(.btn-outline):hover, +.open>.btn.red:not(.btn-outline).dropdown-toggle { + color: #fff; + background-color: #c71c27; + border-color: #dc1e2b +} +.btn.red:not(.btn-outline).active.focus, +.btn.red:not(.btn-outline).active:focus, +.btn.red:not(.btn-outline).active:hover, +.btn.red:not(.btn-outline):active.focus, +.btn.red:not(.btn-outline):active:focus, +.btn.red:not(.btn-outline):active:hover, +.open>.btn.red:not(.btn-outline).dropdown-toggle.focus, +.open>.btn.red:not(.btn-outline).dropdown-toggle:focus, +.open>.btn.red:not(.btn-outline).dropdown-toggle:hover { + color: #fff; + background-color: #c51b26; + border-color: #d82431 +} +a.btn.blue-bgcolor:hover { + color: #fff; +} +.btn.red:not(.btn-outline).active, +.btn.red:not(.btn-outline):active, +.open>.btn.red:not(.btn-outline).dropdown-toggle { + background-image: none +} +.btn.red:not(.btn-outline).disabled.focus, +.btn.red:not(.btn-outline).disabled:focus, +.btn.red:not(.btn-outline).disabled:hover, +.btn.red:not(.btn-outline)[disabled].focus, +.btn.red:not(.btn-outline)[disabled]:focus, +.btn.red:not(.btn-outline)[disabled]:hover, +fieldset[disabled] .btn.red:not(.btn-outline).focus, +fieldset[disabled] .btn.red:not(.btn-outline):focus, +fieldset[disabled] .btn.red:not(.btn-outline):hover { + background-color: #e7505a; + border-color: #e7505b +} +.btn.red:not(.btn-outline) .badge { + color: #e7505a; + background-color: #fff +} +.btn.btn-outline.red { + border-color: #e7505a; + color: #e7505a; + background: 0 0 +} +.btn.btn-outline.red.active, +.btn.btn-outline.red:active, +.btn.btn-outline.red:active:focus, +.btn.btn-outline.red:active:hover, +.btn.btn-outline.red:focus, +.btn.btn-outline.red:hover { + border-color: #e7505a; + color: #fff; + background-color: #e7505b +} +.btn.yellow:not(.btn-outline) { + color: #fff; + background-color: #c49f47; + border-color: #c49f48 +} +.btn.yellow:not(.btn-outline).focus, +.btn.yellow:not(.btn-outline):focus { + color: #fff; + background-color: #a48334; + border-color: #6a5422 +} +.btn.yellow:not(.btn-outline).active, +.btn.yellow:not(.btn-outline):active, +.btn.yellow:not(.btn-outline):hover, +.open>.btn.yellow:not(.btn-outline).dropdown-toggle { + color: #fff; + background-color: #a48334; + border-color: #9c7c32 +} +.btn.yellow:not(.btn-outline).active.focus, +.btn.yellow:not(.btn-outline).active:focus, +.btn.yellow:not(.btn-outline).active:hover, +.btn.yellow:not(.btn-outline):active.focus, +.btn.yellow:not(.btn-outline):active:focus, +.btn.yellow:not(.btn-outline):active:hover, +.open>.btn.yellow:not(.btn-outline).dropdown-toggle.focus, +.open>.btn.yellow:not(.btn-outline).dropdown-toggle:focus, +.open>.btn.yellow:not(.btn-outline).dropdown-toggle:hover { + color: #fff; + background-color: #896d2c; + border-color: #6a5422 +} +.btn.yellow:not(.btn-outline).active, +.btn.yellow:not(.btn-outline):active, +.open>.btn.yellow:not(.btn-outline).dropdown-toggle { + background-image: none +} +.btn.yellow:not(.btn-outline).disabled.focus, +.btn.yellow:not(.btn-outline).disabled:focus, +.btn.yellow:not(.btn-outline).disabled:hover, +.btn.yellow:not(.btn-outline)[disabled].focus, +.btn.yellow:not(.btn-outline)[disabled]:focus, +.btn.yellow:not(.btn-outline)[disabled]:hover, +fieldset[disabled] .btn.yellow:not(.btn-outline).focus, +fieldset[disabled] .btn.yellow:not(.btn-outline):focus, +fieldset[disabled] .btn.yellow:not(.btn-outline):hover { + background-color: #c49f47; + border-color: #c49f48 +} +.btn.yellow:not(.btn-outline) .badge { + color: #c49f47; + background-color: #fff +} +.btn.btn-outline.yellow { + border-color: #c49f47; + color: #c49f47; + background: 0 0 +} +.btn.btn-outline.yellow.active, +.btn.btn-outline.yellow:active, +.btn.btn-outline.yellow:active:focus, +.btn.btn-outline.yellow:active:hover, +.btn.btn-outline.yellow:focus, +.btn.btn-outline.yellow:hover { + border-color: #c49f47; + color: #fff; + background-color: #c49f48 +} +.btn.purple:not(.btn-outline) { + color: #fff; + background-color: #8E44AD; + border-color: #8E44AE +} +.btn.purple:not(.btn-outline).focus, +.btn.purple:not(.btn-outline):focus { + color: #fff; + background-color: #703688; + border-color: #432051 +} +.btn.purple:not(.btn-outline).active, +.btn.purple:not(.btn-outline):active, +.btn.purple:not(.btn-outline):hover, +.open>.btn.purple:not(.btn-outline).dropdown-toggle { + color: #fff; + background-color: #703688; + border-color: #6a3381 +} +.btn.purple:not(.btn-outline).active.focus, +.btn.purple:not(.btn-outline).active:focus, +.btn.purple:not(.btn-outline).active:hover, +.btn.purple:not(.btn-outline):active.focus, +.btn.purple:not(.btn-outline):active:focus, +.btn.purple:not(.btn-outline):active:hover, +.open>.btn.purple:not(.btn-outline).dropdown-toggle.focus, +.open>.btn.purple:not(.btn-outline).dropdown-toggle:focus, +.open>.btn.purple:not(.btn-outline).dropdown-toggle:hover { + color: #fff; + background-color: #5b2c6f; + border-color: #432051 +} +.btn.purple:not(.btn-outline).active, +.btn.purple:not(.btn-outline):active, +.open>.btn.purple:not(.btn-outline).dropdown-toggle { + background-image: none +} +.btn.purple:not(.btn-outline).disabled.focus, +.btn.purple:not(.btn-outline).disabled:focus, +.btn.purple:not(.btn-outline).disabled:hover, +.btn.purple:not(.btn-outline)[disabled].focus, +.btn.purple:not(.btn-outline)[disabled]:focus, +.btn.purple:not(.btn-outline)[disabled]:hover, +fieldset[disabled] .btn.purple:not(.btn-outline).focus, +fieldset[disabled] .btn.purple:not(.btn-outline):focus, +fieldset[disabled] .btn.purple:not(.btn-outline):hover { + background-color: #8E44AD; + border-color: #8E44AE; +} +.btn.purple:not(.btn-outline) .badge { + color: #8E44AD; + background-color: #fff +} +.btn.btn-outline.purple { + border-color: #8E44AD; + color: #8E44AD; + background: 0 0 +} +.btn.btn-outline.purple.active, +.btn.btn-outline.purple:active, +.btn.btn-outline.purple:active:focus, +.btn.btn-outline.purple:active:hover, +.btn.btn-outline.purple:focus, +.btn.btn-outline.purple:hover { + border-color: #8E44AD; + color: #fff; + background-color: #8E44AE +} +.btn.btn-outline.blue-bgcolor.active, +.btn.btn-outline.blue-bgcolor:active, +.btn.btn-outline.blue-bgcolor:active:focus, +.btn.btn-outline.blue-bgcolor:active:hover, +.btn.btn-outline.blue-bgcolor:focus, +.btn.btn-outline.blue-bgcolor:hover { + border-color: #2196f2; + color: #fff; + background-color: #2196f3; +} +.btn.btn-outline.deepPink.active, .btn.btn-outline.deepPink:active, .btn.btn-outline.deepPink:active:focus, .btn.btn-outline.deepPink:active:hover, .btn.btn-outline.deepPink:focus, .btn.btn-outline.deepPink:hover { + border-color: #e91e63; + color: #fff; + background-color: #e91e63; +} +.btn-circle { + border-radius: 25px!important; + overflow: hidden; + outline: 0px !important; +} +.btn-circle-right { + border-radius: 0 25px 25px 0!important +} +.btn-circle-left { + border-radius: 25px 0 0 25px!important +} +.btn-circle-bottom { + border-radius: 0 0 25px 25px!important +} +.btn-circle-top { + border-radius: 25px 25px 0 0!important +} +.btn-icon-only { + height: 34px; + width: 34px; + text-align: center; + padding-left: 0; + padding-right: 0 +} +.btn-icon-only>[class^=icon-], +.btn-icon-only>i { + text-align: center; + margin-top: 2px +} +.btn-group.btn-group-circle>.btn:first-child { + border-radius: 25px 0 0 25px!important +} +.btn-group.btn-group-circle>.btn:last-child { + border-radius: 0 25px 25px 0!important +} +.btn-group.btn-group-devided>.btn { + margin-right: 5px +} +.btn-group.btn-group-devided>.btn:last-child { + margin-right: 0 +} +.btn-group-vertical.btn-group-vertical-circle>.btn:first-child { + border-radius: 25px 25px 0 0!important +} +.btn-group-vertical.btn-group-vertical-circle>.btn:last-child { + border-radius: 0 0 25px 25px!important +} +.btn-group .btn { + margin-right: 0; +} +.btn-group-vertical .btn { + margin-bottom: 0; +} +.btn-group>.dropdown-menu, +.dropdown-menu { + box-shadow: 0 3px 6px rgba(0, 0, 0, .16), 0 3px 6px rgba(0, 0, 0, .22)!important +} +.btn-group>.dropdown-menu { + filter: alpha(opacity=0); + margin-top: 0 +} +.btn-group.dropup>.dropdown-menu { + margin-top: 0; + margin-bottom: 0 +} +.btn-group.open>.dropdown-menu { + transition: opacity 1.5s cubic-bezier(.23, 1, .32, 1) 0s; + opacity: 1; + filter: alpha(opacity=100) +} +.btn { + font-size: 12px; + transition: box-shadow .28s cubic-bezier(.4, 0, .2, 1); + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + overflow: hidden; + position: relative; + padding: 8px 14px 7px; + margin: 0 0px 10px 0; +} +.btn-chatpane .btn, +.search-form .btn { + box-shadow: none!important; + overflow: visible +} +.btn.btn-link { + box-shadow: none; + color: #337ab7 +} +.btn.btn-link:hover { + text-decoration: none +} +.btn>i { + margin-top: 0; + margin-left: 3px; + margin-right: 3px +} +.btn.btn-sm { + font-size: 11px; + padding: 6px 18px +} +.btn.btn-xs { + font-size: 11px; + padding: 3px 8px +} +.btn.btn-lg { + font-size: 16px; + padding: 12px 26px 10px +} +.btn.btn-icon-only { + padding-left: 0; + padding-right: 0 +} +.btn.btn-icon-only>i { + margin-left: 0; + margin-right: 0 +} +.btn.m-icon-big { + padding: 9px 16px 8px +} +.btn.m-icon-big.m-icon-only { + padding: 9px 8px 8px 0 +} +.btn.m-icon-big [class^=m-icon-big-] { + margin: 0 0 0 10px +} +.btn.m-icon-ony>i { + margin-left: 0 +} +.btn.m-icon { + padding: 7px 14px +} +.btn.m-icon [class^=m-icon-] { + margin: 4px 0 0 5px +} +.btn.m-icon.m-icon-only { + padding: 7px 10px 7px 6px +} +.btn.btn-outline.green-bgcolor { + border-color: #32c5d2; + color: #32c5d2; + background: 0 0 +} +.btn.btn-outline.blue-bgcolor { + border-color: #32c5d2; + color: #32c5d2; + background: 0 0; +} +.btn.btn-outline.deepPink { + border-color: #e91e63 ; + color: #e91e63 ; + background: 0 0; +} +.btn.btn-outline.green-bgcolor.active, +.btn.btn-outline.green-bgcolor:active, +.btn.btn-outline.green-bgcolor:active:focus, +.btn.btn-outline.green-bgcolor:active:hover, +.btn.btn-outline.green-bgcolor:focus, +.btn.btn-outline.green-bgcolor:hover { + border-color: #32c5d2; + color: #FFF; + background-color: #32c5d3 +} +.btn.no-margin{ + margin: 0; +} +/************************************************************ + + [18. LABEL ] + +*************************************************************/ + +label { + font-weight: 400 +} +.label { + text-shadow: none!important; + color: #fff; + font-family: Roboto,sans-serif; + text-transform: uppercase; + font-weight: 600; + padding: 8px 15px; + background: #1ebdcc; + line-height: 1; + text-align: center; +} +.label.label-sm { + font-size: 13px; + padding: 2px 5px +} +h1 .label, +h2 .label, +h3 .label, +h4 .label, +h5 .label, +h6 .label { + font-size: 75% +} +.label-event { + background-color: #dc35a9 !important +} +.label-event[href]:focus, +.label-event[href]:hover { + background-color: #9ca8bb !important +} +.label-primary { + background-color: #337ab7 !important +} +.label-primary[href]:focus, +.label-primary[href]:hover { + background-color: #286090 !important +} +.label-success { + background-color: #36c6d3 !important +} +.label-success[href]:focus, +.label-success[href]:hover { + background-color: #27a4b0 !important +} +.label-info { + background-color: #659be0 !important +} +.label-info[href]:focus, +.label-info[href]:hover { + background-color: #3a80d7 !important +} +.label-warning { + background-color: #F1C40F !important +} +.label-warning[href]:focus, +.label-warning[href]:hover { + background-color: #c29d0b !important +} +.label-danger { + background-color: #ed6b75 !important +} +.label-danger[href]:focus, +.label-danger[href]:hover { + background-color: #e73d4a !important +} +.label.label-icon { + padding: 4px 0 4px 4px; + margin-right: 2px; + text-align: center!important +} +.label.label-icon>i { + font-size: 12px; + text-align: center!important +} +.ie8 .label.label-icon, +.ie9 .label.label-icon { + padding: 3px 0 3px 3px +} +.label-menu { + margin-right: 30px; + font-size: 10px; + border-radius: 60px; + padding: 6px 8px; + min-width: 30px; + height: 20px; + float: right; +} +.sidemenu-closed .label-menu { + margin-right: -5px; + margin-top: -5px; +} +.label.label-sm { + font-size: 10px; + font-weight: 600; + padding: 6px 6px +} +.label.label-icon { + padding: 4px 0 4px 4px!important; + font-size: 12px!important +} +.note p, +.page-loading, +.panel .panel-body { + font-size: 14px +} +.ie8 .label.label-icon, +.ie9 .label.label-icon { + padding: 3px 0 3px 3px!important +} +.sub-title { + border-bottom: 1px solid rgba(204, 204, 204, 0.35); + padding-bottom: 10px; + margin-bottom: 20px; + text-transform: uppercase; + margin-top: 20px; + font-size: 14px; + font-weight: 600; + color: #2c3e50; +} +/*************************************************************** + + [19. CALENDAR ] + +****************************************************************/ + +.calendar-block .cal1 .clndr .clndr-controls .month { + color: #fff; +} +.calendar-block .cal1 .clndr .clndr-controls .month { + display: inline-block; + width: 190px; + text-align: center; + color: #fff; + font-size: 20px; + text-transform: uppercase; + font-family: Roboto,sans-serif; + font-weight: 300; + padding: 5px 5px; + position: relative; + top: 2px; +} +.calendar-block .cal1 .clndr .clndr-controls { + -webkit-border-radius: 5px 5px 0px 0px; + -moz-border-radius: 5px 5px 0px 0px; + border-radius: 5px 5px 0px 0px; + display: block !important; + position: relative; + margin-bottom: 10px; + text-align: center; + background: #32c5d2; + margin-left: -15px; + margin-right: -15px; + margin-top: -15px; + padding: 45px 20px; + width: auto !important; + color: #fff; +} +.calendar-block .cal1 .clndr .clndr-controls .clndr-control-button .clndr-previous-button, +.calendar-block .cal1 .clndr .clndr-controls .clndr-control-button .clndr-next-button { + color: #fff; +} +.calendar-block .cal1 .clndr .clndr-controls .month span { + display: block; + font-size: 30px; + padding: 0px 10px; + margin-bottom: 0; +} +.clndr-next-button, +.clndr-previous-button { + position: relative; + top: -30px; +} +.calendar-block .day-contents:hover { + width: 30px; + background: #32c5d2; + cursor: pointer; + color: #fff; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 auto; +} +.today .day-contents { + width: 30px; + background: #32c5d2; + cursor: pointer; + color: #fff; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + margin: 0 auto; +} +/*************************************************************** + + [20. DROP DOWN STYLE ] + +****************************************************************/ + +.dropdown.open>.dropdown-toggle, +.dropup.open>.dropdown-toggle { + border-color: #ddd +} +.dropdown-menu { + left: auto; + right: 0; + min-width: 175px; + position: absolute; + z-index: 1000; + display: none; + float: left; + list-style: none; + text-shadow: none; + padding: 0; + background-color: #fff; + font-family: Roboto,sans-serif; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px +} +.dropdown-menu li.divider { + background: #f1f3f6 +} +.dropdown-menu li.header { + padding: 8px 14px 2px +} +.dropdown-menu>li>a { + padding: 8px 16px; + color: #6f6f6f; + text-decoration: none; + display: block; + clear: both; + font-weight: 300; + line-height: 18px; + white-space: nowrap +} +.dropdown-menu>li>a>[class*=" fa-"], +.dropdown-menu>li>a>[class^=fa-] { + color: #888 +} +.dropdown-menu>li>a>[class*=" icon-"], +.dropdown-menu>li>a>[class^=icon-] { + color: #666 +} +.dropdown-menu>li>a>[class*=" glyphicon-"], +.dropdown-menu>li>a>[class^=glyphicon-] { + color: #888 +} +.dropdown-menu>li.active:hover>a, +.dropdown-menu>li.active>a, +.dropdown-menu>li:hover>a { + text-decoration: none; + background-image: none; + background-color: #f6f6f6; + color: #555; + filter: none +} +.dropdown-menu.bottom-up { + top: auto; + bottom: 100%; + margin-bottom: 2px +} +.dropdown-menu.bottom-up:after, +.dropdown-menu.bottom-up:before { + display: none +} +.dropdown-menu>li:first-child:hover>a { + border-radius: 2px 2px 0 0 +} +.dropdown-menu>li:last-child:hover>a { + border-radius: 0 0 2px 2px +} +.dropdown-hover:hover>.dropdown-menu { + display: block +} +.btn-group>.dropdown-menu.pull-left:before, +.dropdown-toggle>.dropdown-menu.pull-left:before, +.dropdown>.dropdown-menu.pull-left:before { + left: auto; + right: 9px +} +.btn-group>.dropdown-menu.pull-left:after, +.dropdown-toggle>.dropdown-menu.pull-left:after, +.dropdown>.dropdown-menu.pull-left:after { + left: auto; + right: 10px +} +.btn-group>.dropdown-menu.pull-right:before, +.dropdown-toggle>.dropdown-menu.pull-right:before, +.dropdown>.dropdown-menu.pull-right:before { + left: auto; + right: 9px +} +.btn-group>.dropdown-menu.pull-right:after, +.dropdown-toggle>.dropdown-menu.pull-right:after, +.dropdown>.dropdown-menu.pull-right:after { + left: auto; + right: 10px +} +.btn-group.dropup>.dropdown-menu, +.dropdown-toggle.dropup>.dropdown-menu, +.dropdown.dropup>.dropdown-menu { + margin-top: 0; + margin-bottom: 10px +} +.btn-group.dropup>.dropdown-menu:after, +.btn-group.dropup>.dropdown-menu:before, +.dropdown-toggle.dropup>.dropdown-menu:after, +.dropdown-toggle.dropup>.dropdown-menu:before, +.dropdown.dropup>.dropdown-menu:after, +.dropdown.dropup>.dropdown-menu:before { + display: none!important +} +.dropdown-toggle:after { + display: none +} +.dropdown-submenu { + position: relative +} +.dropdown-submenu>.dropdown-menu { + top: 5px; + left: 100%; + margin-top: -6px; + margin-left: -1px +} +.dropdown-submenu>a:after { + position: absolute; + display: inline-block; + font-size: 14px; + right: 7px; + top: 7px; + font-family: FontAwesome; + height: auto; + content: "\f105"; + font-weight: 300 +} +.dropdown-submenu:hover>.dropdown-menu { + display: block +} +.dropdown-submenu:hover>a:after { + border-left-color: #fff +} +.dropdown-submenu.pull-left { + float: none +} +.dropdown-submenu.pull-left>.dropdown-menu { + left: -100%; + margin-left: 10px +} +.dropup .dropdown-submenu>.dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px +} +.nav.pull-right>li>.dropdown-menu, +.nav>li>.dropdown-menu.pull-right { + right: 0; + left: auto +} +.nav.pull-right>li>.dropdown-menu:before, +.nav>li>.dropdown-menu.pull-right:before { + right: 12px; + left: auto +} +.nav.pull-right>li>.dropdown-menu:after, +.nav>li>.dropdown-menu.pull-right:after { + right: 13px; + left: auto +} +.nav.pull-right>li>.dropdown-menu .dropdown-menu, +.nav>li>.dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0 +} +.dropdown-content { + padding: 10px +} +.dropdown-content form { + margin: 0 +} +.dropdown.inline .dropdown-menu { + display: inline-block; + position: relative +} +.dropdown-menu { + border: 0!important; + border-radius: 2px!important; + margin: 0 +} +.dropdown-menu:after, +.dropdown-menu:before { + display: none!important +} +.dropdown-menu-footer { + padding: 10px; + border-top: 1px solid #EFF2F6; + text-align: center; + float: left; + width: 100%; +} +.dropdown-menu-footer { + padding: 10px; + border-top: 1px solid #EFF2F6; + text-align: center; + float: left; + width: 100%; + background-color: #F3F7F9; +} +.dropdown-menu-footer a { + color: #a3afb7; + transition: 0.5s; +} +.dropdown-menu-footer a:hover { + color: #18B2BF; + text-decoration: none; +} +/*************************************************************** + + [21. CHECKBOX & RADIO ] + +****************************************************************/ + +.rt-chkbox, +.rt-radio { + display: inline-block; + position: relative; + padding-left: 30px; + margin-bottom: 15px; + cursor: pointer; + font-size: 14px; + -webkit-transition: all .3s; + -moz-transition: all .3s; + -ms-transition: all .3s; + -o-transition: all .3s; + transition: all .3s +} +.rt-chkbox.rt-chkbox-disabled, +.rt-chkbox.rt-radio-disabled, +.rt-radio.rt-chkbox-disabled, +.rt-radio.rt-radio-disabled { + opacity: .6; + filter: alpha(opacity=60) +} +.rt-chkbox>input, +.rt-radio>input { + position: absolute; + z-index: -1; + opacity: 0; + filter: alpha(opacity=0) +} +.rt-chkbox>span, +.rt-radio>span { + border: 1px solid transparent; + position: absolute; + top: 0; + left: 0; + height: 19px; + width: 19px; + background: #E6E6E6 +} +.rt-chkbox>span:after, +.rt-radio>span:after { + content: ''; + position: absolute; + display: none +} +.rt-chkbox-list .rt-chkbox, +.rt-chkbox-list .rt-radio, +.rt-chkbox>input:checked~span:after, +.rt-radio-list .rt-chkbox, +.rt-radio-list .rt-radio, +.rt-radio>input:checked~span:after { + display: block +} +.rt-chkbox:hover>input:not([disabled])~span, +.rt-chkbox>input:focus~span, +.rt-radio:hover>input:not([disabled])~span, +.rt-radio>input:focus~span { + background: #d9d9d9; + -webkit-transition: all .3s; + -moz-transition: all .3s; + -ms-transition: all .3s; + -o-transition: all .3s; + transition: all .3s +} +.rt-chkbox:hover>input:not([disabled]):checked~span, +.rt-chkbox>input:checked~span, +.rt-radio:hover>input:not([disabled]):checked~span, +.rt-radio>input:checked~span { + -webkit-transition: all .3s; + -moz-transition: all .3s; + -ms-transition: all .3s; + -o-transition: all .3s; + transition: all .3s; + background: #d9d9d9 +} +.rt-chkbox.rt-chkbox-outline:hover>input:not([disabled]):checked~span, +.rt-chkbox.rt-chkbox-outline:hover>input:not([disabled])~span, +.rt-chkbox.rt-chkbox-outline>input:checked~span, +.rt-chkbox.rt-chkbox-outline>input:focus~span, +.rt-chkbox.rt-chkbox-outline>span, +.rt-chkbox.rt-radio-outline:hover>input:not([disabled]):checked~span, +.rt-chkbox.rt-radio-outline:hover>input:not([disabled])~span, +.rt-chkbox.rt-radio-outline>input:checked~span, +.rt-chkbox.rt-radio-outline>input:focus~span, +.rt-chkbox.rt-radio-outline>span, +.rt-radio.rt-chkbox-outline:hover>input:not([disabled]):checked~span, +.rt-radio.rt-chkbox-outline:hover>input:not([disabled])~span, +.rt-radio.rt-chkbox-outline>input:checked~span, +.rt-radio.rt-chkbox-outline>input:focus~span, +.rt-radio.rt-chkbox-outline>span, +.rt-radio.rt-radio-outline:hover>input:not([disabled]):checked~span, +.rt-radio.rt-radio-outline:hover>input:not([disabled])~span, +.rt-radio.rt-radio-outline>input:checked~span, +.rt-radio.rt-radio-outline>input:focus~span, +.rt-radio.rt-radio-outline>span { + border: 1px solid #d9d9d9; + background: 0 0 +} +.rt-chkbox>span:after { + left: 6px; + top: 3px; + width: 5px; + height: 10px; + border: solid #666; + border-width: 0 2px 2px 0; + transform: rotate(45deg) +} +.rt-chkbox>input:disabled~span:after { + border-color: #666 +} +.rt-chkbox-list, +.rt-radio-list { + padding: 10px 0 +} +.form-horizontal .form-group .rt-chkbox-list, +.form-horizontal .form-group .rt-radio-list { + padding-top: 0 +} +.rt-chkbox-inline, +.rt-radio-inline { + padding: 10px 0 +} +.form-horizontal .form-group .rt-chkbox-inline, +.form-horizontal .form-group .rt-radio-inline { + padding-top: 8px +} +.rt-chkbox-inline .rt-chkbox, +.rt-chkbox-inline .rt-radio, +.rt-radio-inline .rt-chkbox, +.rt-radio-inline .rt-radio { + display: inline-block; + margin-right: 15px +} +.rt-chkbox-inline .rt-chkbox:last-child, +.rt-chkbox-inline .rt-radio:last-child, +.rt-radio-inline .rt-chkbox:last-child, +.rt-radio-inline .rt-radio:last-child { + margin-right: 0 +} +td>.rt-chkbox.rt-chkbox-single, +td>.rt-radio.rt-radio-single, +th>.rt-chkbox.rt-chkbox-single, +th>.rt-radio.rt-radio-single { + right: -5px +} +.rt-radio>span, +.timeline .timeline-badge-userpic img { + -webkit-border-radius: 50%!important; + -moz-border-radius: 50%!important +} +.rt-radio>span { + -ms-border-radius: 50%!important; + -o-border-radius: 50%!important; + border-radius: 50%!important +} +.rt-radio>span:after { + left: 6px; + top: 6px; + height: 6px; + width: 6px; + border-radius: 50%; + background: #666 +} +.rt-radio>input:disabled~span:after { + background: #666 +} +/********************************************************** + + [22. ICON BUTTON ] + +***********************************************************/ + +.icon-btn { + height: 60px; + min-width: 80px; + margin: 5px 5px 0 0; + padding: 12px 0 0; + background-color: #fafafa; + background-image: none; + display: inline-block; + color: #646464; + text-shadow: none; + text-align: center; + cursor: pointer; + position: relative +} +.icon-btn, +.icon-btn:hover { + -webkit-transition: all .3s ease; + -moz-transition: all .3s ease; + -ms-transition: all .3s ease; + -o-transition: all .3s ease +} +.icon-btn, +.ie8 .icon-btn:hover { + filter: none +} +.loading-message, +.page-loading { + min-width: 125px; + vertical-align: middle +} +.icon-btn:hover { + border-color: #999; + color: #444; + text-shadow: 0 1px 0 #fff; + transition: all .3s ease; + text-decoration: none +} +.icon-btn:hover>.badge { + -webkit-transition: all .3s ease; + -moz-transition: all .3s ease; + -ms-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease +} +.icon-btn>.badge { + position: absolute; + font-size: 11px; + font-weight: 300; + top: -5px; + right: -5px; + padding: 3px 6px; + color: #fff; + text-shadow: none; + border-width: 0; + border-style: solid; + -webkit-border-radius: 12px; + -moz-border-radius: 12px; + border-radius: 12px +} +.icon-btn>i { + font-size: 18px +} +.icon-btn { + border: 0; + transition: box-shadow .28s cubic-bezier(.4, 0, .2, 1) +} +.icon-btn>div { + margin-top: 5px; + margin-bottom: 20px; + text-transform: uppercase; + font-weight: 600; + font-size: 11px; + color: #565d66 +} +/************************************************************ + + [23. VALIDATION ICONS ] + +*************************************************************/ + +.input-icon { + position: relative; + left: 0 +} +.input-icon>.form-control { + padding-left: 33px +} +.input-group .input-icon>.form-control { + border-radius: 2px 0 0 2px +} +.input-group .input-icon.right>.form-control, +.tabs-right.nav-tabs>li>a:focus, +.tabs-right.nav-tabs>li>a:hover { + -webkit-border-radius: 0 2px 2px 0; + -moz-border-radius: 0 2px 2px 0; + -ms-border-radius: 0 2px 2px 0; + -o-border-radius: 0 2px 2px 0 +} +.input-icon>i { + color: #ccc; + display: block; + position: absolute; + margin: 11px 2px 4px 10px; + z-index: 3; + width: 16px; + font-size: 16px; + text-align: center; + left: 0 +} +.modal .input-icon>i { + z-index: 10055 +} +.has-success .input-icon>i { + color: #36c6d3 +} +.has-warning .input-icon>i { + color: #F1C40F +} +.has-error .input-icon>i { + color: #ed6b75 +} +.input-icon.right { + left: auto; + right: 0 +} +.input-icon.right>.form-control { + padding-right: 33px; + padding-left: 12px +} +.input-group .input-icon.right>.form-control { + border-radius: 0 2px 2px 0 +} +.input-icon.right>i { + left: auto; + right: 8px; + float: right +} +.input-icon.input-icon-lg>i { + margin-top: 16px +} +.input-icon.input-icon-sm>i { + margin-top: 8px; + font-size: 13px +} +/**************************************************************** + + [24. NOTE ] + +*****************************************************************/ + +.note { + margin: 0 0 20px; + padding: 15px 30px 15px 15px +} +.note h1, +.note h2, +.note h3, +.note h4, +.note h5, +.note h6 { + margin-top: 0 +} +.note h1 .close, +.note h2 .close, +.note h3 .close, +.note h4 .close, +.note h5 .close, +.note h6 .close { + margin-right: -10px +} +.note p { + margin: 0 +} +.note p:last-child { + margin-bottom: 0 +} +.note.note-default { + border-color: #b0c1d2; + color: #000 +} +.note.note-default.note-bordered { + background-color: #eef1f5; + border-color: #c0cedb +} +.note.note-default.note-shadow { + background-color: #f1f4f7; + border-color: #d1dbe4; + box-shadow: 5px 5px rgba(212, 221, 230, .2) +} +.note.note-success { + background-color: #c0edf1; + border-color: #58d0da; + color: #000 +} +.note.note-success.note-bordered { + background-color: #a7e6ec; + border-color: #6dd6df +} +.note.note-success.note-shadow { + background-color: #abe7ed; + border-color: #81dbe3; + box-shadow: 5px 5px rgba(134, 221, 228, .2) +} +.note.note-info { + background-color: #f5f8fd; + border-color: #8bb4e7; + color: #010407 +} +.note.note-info.note-bordered { + background-color: #dbe8f8; + border-color: #a0c2ec +} +.note.note-info.note-shadow { + background-color: #e0ebf9; + border-color: #b5cff0; + box-shadow: 5px 5px rgba(185, 210, 241, .2) +} +.note.note-warning { + background-color: #faeaa9; + border-color: #f3cc31; + color: #000 +} +.note.note-warning.note-bordered { + background-color: #f8e38c; + border-color: #f4d249 +} +.note.note-warning.note-shadow { + background-color: #f9e491; + border-color: #f6d861; + box-shadow: 5px 5px rgba(246, 217, 102, .2) +} +.note.note-danger { + background-color: #fef7f8; + border-color: #f0868e; + color: #210406 +} +.note.note-danger.note-bordered { + background-color: #fbdcde; + border-color: #f39da3 +} +.note.note-danger.note-shadow { + background-color: #fbe1e3; + border-color: #f6b3b8; + box-shadow: 5px 5px rgba(246, 184, 189, .2) +} +.note { + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + border: 0 +} +/**************************************************************** + + [25. PAGINATION ] + +*****************************************************************/ + +.pagination { + margin: 10px 0 +} +.pagination.pagination-circle>li:first-child>a { + border-radius: 25px 0 0 25px!important +} +.pagination.pagination-circle>li:last-child>a { + border-radius: 0 25px 25px 0!important +} +/**************************************************************** + + [26. ACCORDION ] + +*****************************************************************/ + +.accordion .card-header:after { + font-family: 'FontAwesome'; + content: "\f068"; + float: right; +} +.accordion .card-header.collapsed:after { + /* symbol for "collapsed" panels */ + content: "\f067"; +} +/**************************************************************** + + [27. TAB ] + +*****************************************************************/ + +.tab-pane>p:last-child { + margin-bottom: 0 +} +.tabs-reversed>li { + float: right; + margin-right: 0 +} +.tabs-reversed>li>a { + margin-right: 0 +} +.customtab.nav-tabs .nav-link.active, .customtab.nav-tabs .nav-link:hover, .customtab.nav-tabs .nav-link.active:focus { + border-bottom: 0px solid #36c6d3; + background-color: rgb(102, 115, 252) !important; + box-shadow: 0 5px 20px 0 rgba(0, 0, 0, .2), 0 13px 24px -11px rgb(102, 115, 252); + color: #fff; + border-radius: 30px; +} +.customtab.nav-tabs .nav-link { + border-left: 0; + border-top: 0; + border-right: 0; +} +.btmBorder{ + border-bottom: 0px !important; +} +.customtab { + border-bottom: 2px solid #f7fafc; +} +nav-tabs>li { + float: left; + margin-bottom: -1px; +} +.nav-tabs>li { + float: left; + margin-bottom: -1px; +} +.nav-pills>li>a, .nav-tabs>li>a { + font-size: 14px; + -webkit-border-radius: 2px 2px 0 0; + -moz-border-radius: 2px 2px 0 0; + -ms-border-radius: 2px 2px 0 0; + -o-border-radius: 2px 2px 0 0; + position: relative; + display: block; + padding: 10px 15px; + border-radius: 2px 2px 0 0; + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs>li a.active, .nav-tabs>li a.active:focus, .nav-tabs>li a.active:hover { + color: #555; + cursor: default; + background-color: #fff; + border-bottom-color: transparent; +} +/**************************************************************** + + [28. STATE OVERVIEW ] + +*****************************************************************/ + +.state-overview h1.sbold, +.state-overview p.sbold { + float: left; +} +.state-overview p { + float: left; + width: 100%; +} +.state-overview .purple { + background: #a979d1; + color: #fff; +} +.state-overview .orange { + background: #E67D21; + color: #fff; +} +.state-overview .blue { + background: #55ACEF; + color: #fff; +} +.state-overview .blue { + background: #55ACEF; + color: #fff; +} +.state-overview .green { + background: #15A087; + color: #fff; +} +.state-overview .symbol { + width: 30%; + padding: 50px 15px; +} +.state-overview .symbol, +.state-overview .value { + display: inline-block; + text-align: center; +} +.state-overview .symbol i { + font-size: 25px; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.state-overview .value.white { + border-color: rgba(255, 255, 255, .2); + text-align: left; +} +.state-overview .value { + width: 68%; + margin-top: 30px; + border-left: 1px solid; + padding-left: 10%; +} +.state-overview .value { + float: right; + text-align: left; +} +.state-overview .symbol, +.state-overview .value { + display: inline-block; + text-align: center; +} +.state-overview .value h1 { + font-weight: 300; +} +.state-overview .value h1, +.state-overview .value p { + margin: 0; + padding: 0; +} +.state-overview .value h1, +.state-overview .value p { + margin: 0; + padding-bottom: 15px; +} +.bg-blue { + background-color: #389af0; +} +.info-box { + border-bottom-left-radius: 5px; + border-top-right-radius: 5px; + min-height: 100px; + background: #fff; + width: 100%; + box-shadow: 0 5px 20px rgba(0, 0, 0, .1); + -webkit-box-shadow: 0 5px 20px rgba(0, 0, 0, .1); + margin-bottom: 20px; + padding: 15px; +} +.info-box small { + font-size: 14px; +} +.info-box .progress { + background: rgba(0, 0, 0, .2); + margin: 5px -10px 5px 0; + height: 2px; +} +.info-box .progress, .info-box .progress .progress-bar { + border-radius: 0; +} +.info-box .progress .progress-bar { + background: #fff; +} +.info-box-icon { + float: left; + height: 70px; + width: 70px; + text-align: center; + font-size: 30px; + line-height: 74px; + background: rgba(0, 0, 0, .2); + border-radius: 100%} +.info-box-icon.push-bottom { + margin-top: 20px; +} +.info-box-icon>img { + max-width: 100%} +.info-box-content { + padding: 10px 10px 10px 0; + margin-left: 90px; +} +.info-box-number { + font-weight: 300; + font-size: 21px; +} +.info-box-text, .progress-description { + display: block; + font-size: 16px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + font-weight: 400; +} +.progress-description { + margin: 0; +} +/******************************************************************** + + [29. BORDER BOX ] + +*********************************************************************/ + +.borderBox.light.bordered { + border: 1px solid #e7ecf1!important; +} +.borderBox.light { + padding: 12px 20px 15px; + background-color: #fff; +} +.borderBox { + margin-top: 0; + margin-bottom: 25px; + padding: 0; + border-radius: 2px; + box-shadow: 0 2px 3px 2px rgba(0, 0, 0, .03); +} +.borderBox.light.bordered>.borderBox-title { + border-bottom: 1px solid #eef1f5; +} +.borderBox.light>.borderBox-title { + padding: 0; + min-height: 48px; +} +.borderBox.bordered>.borderBox-title { + border-bottom: 0; +} +.borderBox>.borderBox-title { + border-bottom: 1px solid #eee; + padding: 0; + margin-bottom: 10px; + min-height: 41px; + -webkit-border-radius: 2px 2px 0 0; + -moz-border-radius: 2px 2px 0 0; + -ms-border-radius: 2px 2px 0 0; + -o-border-radius: 2px 2px 0 0; + border-radius: 2px 2px 0 0; +} +.borderBox>.borderBox-title:after, +.borderBox>.borderBox-title:before { + content: " "; + display: table; +} +.borderBox.light>.borderBox-title>.caption { + color: #666; + padding: 10px 0; +} +.borderBox>.borderBox-title>.caption { + float: left; + display: inline-block; + font-size: 18px; + line-height: 18px; + padding: 10px 0; +} +.borderBox.light>.borderBox-title>.caption>.caption-subject { + font-size: 16px; +} +.borderBox>.borderBox-title>.nav-tabs { + background: 0 0; + margin: 1px 0 0; + float: right; + display: inline-block; + border: 0; +} +.borderBox.light>.borderBox-title>.nav-tabs>li { + margin: 0; + padding: 0; +} +.borderBox>.borderBox-title>.nav-tabs>li { + background: 0 0; + margin: 0; +} +.borderBox.light>.borderBox-title>.nav-tabs>li>a { + margin: 0; + padding: 12px 13px 13px; + font-size: 13px; + color: #666; +} +.borderBox>.borderBox-title>.nav-tabs>li>a { + background: 0 0; + margin: 5px 0 0 1px; + border: 0; + padding: 8px 10px; + color: #fff; +} +.borderBox.light>.borderBox-title>.nav-tabs>li.active>a, +.borderBox.light>.borderBox-title>.nav-tabs>li:hover>a { + margin: 0; + background: 0 0; + color: #333; +} +.borderBox.light>.borderBox-title>.nav-tabs>li>a { + margin: 0; + padding: 12px 13px 13px; + font-size: 13px; + color: #666; +} +/*************************************************************** + + [30. RATING BUTTON ] + +****************************************************************/ + +.rating { + unicode-bidi: bidi-override; + direction: rtl; +} +.rating span.star, +.rating span.star { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + display: inline-block; + font-size: 22px; +} +.rating span.star:before, +.rating span.star:before { + content: "\f006"; + padding-right: 5px; + color: #BEC3C7; +} +.rating span.star:hover, +.rating span.star:hover { + cursor: pointer; +} +.rating span.star, +.rating span.star { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + display: inline-block; + font-size: 22px; +} +.rating span.star:hover:before, +.rating span.star:hover:before, +.rating span.star:hover ~ span.star:before, +.rating span.star:hover ~ span.star:before { + content: "\f005"; + color: #986cbc; +} +.rating span.star:before, +.rating span.star:before { + content: "\f006"; + padding-right: 5px; + color: #BEC3C7; +} +/********************************************************************* + + [31. TO DO LIST ] + +**********************************************************************/ + +.todo-title { + margin-right: 25px; + padding-top: 5px; +} +.to-do-list { + padding-left: 0; + margin-top: -10px; + font-size: 12px; + min-height: 311px; + float: left; + width: 100%; +} +.to-do-list li { + padding: 17px 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + position: relative; + cursor: move; + list-style: none; + font-size: 14px; + background: #fff; + border-bottom: 1px dotted rgba(0, 0, 0, 0.2); +} +.to-do-list li p { + margin: 0px; +} +.todo-actionlist { + position: absolute; + right: -5px; + top: 22px; +} +.todo-actionlist a { + height: 24px; + width: 24px; + display: inline-block; + float: left; +} +.todo-actionlist a i { + height: 24px; + width: 24px; + display: inline-block; + text-align: center; + line-height: 24px; + color: #ccc; +} +.todo-actionlist a:hover i { + color: #666; +} +.todo-done i { + font-size: 14px; +} +.todo-remove i { + font-size: 10px; +} +.line-through { + text-decoration: line-through; +} +.todo-action-bar { + margin-top: 20px; +} +.drag-marker { + height: 17px; + display: block; + float: left; + width: 7px; + position: relative; + top: 6px; +} +.drag-marker i { + height: 2px; + width: 2px; + display: block; + background: #ccc; + box-shadow: 5px 0 0 0px #ccc, 0px 5px 0 0px #ccc, 5px 5px 0 0px #ccc, 0px 10px 0 0px #ccc, 5px 10px 0 0px #ccc, 0px 15px 0 0px #ccc, 5px 15px 0 0px #ccc; + -webkit-box-shadow: 5px 0 0 0px #ccc, 0px 5px 0 0px #ccc, 5px 5px 0 0px #ccc, 0px 10px 0 0px #ccc, 5px 10px 0 0px #ccc, 0px 15px 0 0px #ccc, 5px 15px 0 0px #ccc; + -moz-box-shadow: 5px 0 0 0px #ccc, 0px 5px 0 0px #ccc, 5px 5px 0 0px #ccc, 0px 10px 0 0px #ccc, 5px 10px 0 0px #ccc, 0px 15px 0 0px #ccc, 5px 15px 0 0px #ccc; +} +.to-do-list li .todo-check input[type=checkbox] { + visibility: hidden; +} +.inbox-small-cells .todo-check input[type=checkbox] { + visibility: hidden; +} +.todo-check input[type=checkbox] { + visibility: hidden; +} +.todo-check { + width: 20px; + position: relative; + margin-right: 10px; + margin-left: 10px; + margin-top: 5px; +} +.todo-check label { + cursor: pointer; + position: absolute; + width: 20px; + height: 20px; + top: 0; + left: 0px; + -webkit-border-radius: 2px; + border-radius: 2px; + border: #ccc 1px solid; +} +.todo-check label:after { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); + opacity: 0; + content: ''; + position: absolute; + width: 13px; + height: 8px; + background: transparent; + top: 3px; + left: 3px; + border: 3px solid #cfcfcf; + border-top: none; + border-right: none; + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + transform: rotate(-45deg); +} +.todo-checklabel:hover::after { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; + filter: alpha(opacity=30); + opacity: 0.3; +} +.todo-check input[type=checkbox]:checked+label:after { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + filter: alpha(opacity=100); + opacity: 1; +} +.todo-entry { + float: left; + width: 88%; +} +.StrikeThrough { + text-decoration: line-through; +} +/*********************************************************************** + + [32. BADGE ] + +***********************************************************************/ + +.badge { + font-size: 11px!important; + height: 18px; + color: #fff; + -webkit-border-radius: 12px!important; + -moz-border-radius: 12px!important; + border-radius: 12px!important; + text-shadow: none!important; + text-align: center +} +.list-group-item>.badge { + float: right; + margin-left: 5px; +} +.badge.badge-roundless { + -webkit-border-radius: 0!important; + -moz-border-radius: 0!important; + border-radius: 0!important +} +.badge.badge-empty { + display: inline-block; + padding: 0; + min-width: 8px; + height: 8px; + width: 8px +} +.badge-default { + background-color: #bac3d0 +} +.badge-primary { + background-color: #337ab7 +} +.badge-info { + background-color: #659be0 +} +.badge-success { + background-color: #36c6d3 +} +.badge-danger { + background-color: #ed6b75 +} +.badge-warning { + background-color: #F1C40F +} +.nav.nav-pills>li>a>.badge, +.nav.nav-stacked>li>a>.badge { + margin-top: -2px +} +.dropdown-menu>li>a>.badge { + position: absolute; + margin-top: 1px; + right: 3px; + display: inline; + padding: 4px 6px 2px +} +.dropdown-menu.badge-roundless { + -webkit-border-radius: 0!important; + -moz-border-radius: 0!important; + border-radius: 0!important +} +.badge { + padding: 4px 6px 2px +} +/**************************************************************************** + + [33. SCROLL TO TOP ] + +*****************************************************************************/ + +.scroll-to-top { + padding: 11px; + border-radius: 4px; + background: #1c262f; + text-align: center; + position: fixed; + bottom: 10px; + z-index: 10001; + display: none; + right: 10px +} +.scroll-to-top>i { + display: inline-block; + color: #ffffff; + font-size: 20px; + opacity: .6; + filter: alpha(opacity=60) +} +.scroll-to-top:hover { + cursor: pointer +} +.scroll-to-top:hover>i { + opacity: 1; + filter: alpha(opacity=100) +} +/********************************************************************* + + [34. FOOTER ] + +**********************************************************************/ + +.page-footer .page-footer-inner { + color: #98a6ba; +} +.page-footer-fixed .page-footer { + background-color: #28303b; +} +.page-footer-fixed.page-footer-fixed-mobile .page-container { + margin-bottom: 20px !important +} +.page-footer { + padding: 20px 5px; + font-size: 13px; + background-color: #222c3c; +} +.page-footer:after, +.page-footer:before { + content: " "; + display: table +} +.page-footer .page-footer-inner { + float: left; + width: 100%; + text-align: center; +} +.page-footer-fixed.page-footer-fixed-mobile .page-footer { + position: fixed; + left: 0; + right: 0; + z-index: 10000; + bottom: 0 +} +.page-footer-fixed.page-footer-fixed-mobile.sidemenu-container-fixed .page-footer { + margin-left: 0 !important +} +.mat-card:not([class*=mat-elevation-z]) { + box-shadow: 0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12); +} + +/********************************************************************* + + [35. MODALS ] + +**********************************************************************/ +.modal-title { + margin-bottom: 0; + line-height: 1.5; + font-size: 1.5rem !important; + font-weight: 300; +} +.modal-sm { + max-width: 300px; +} +.modal-lg { + max-width: 800px; +} +.modal .modal-fluid { + width: 100%; + max-width: 100%; +} +.modal.show .modal-dialog { + -webkit-transform: translate(0,0); + transform: translate(0,0); +} +.modal .modal-dialog.modal-top-right { + top: 10px; + right: 10px; +} +.modal .modal-side { + position: absolute; + bottom: 10px; + right: 10px; + margin: 0; + width: 400px; +} +.modal .modal-dialog.modal-top-left { + top: 10px; + left: 10px; +} +.modal .modal-dialog.modal-bottom-right { + bottom: 10px; + right: 10px; +} +.modal .modal-dialog.modal-bottom-left { + bottom: 10px; + left: 10px; +} \ No newline at end of file diff --git a/bassets/admin/css/typography.css b/bassets/admin/css/typography.css new file mode 100644 index 0000000..e409aae --- /dev/null +++ b/bassets/admin/css/typography.css @@ -0,0 +1,70 @@ +/*------------------------ + Typography +-------------------------*/ + +.table.table-borderless > tbody > tr > td { + border-bottom: 0px; +} +.table.table-condensed thead tr th, .table.table-condensed tbody tr td, .table.table-condensed tbody tr td *:not(.dropdown-default) { + white-space: nowrap; + vertical-align: middle; + overflow: hidden; + text-overflow: ellipsis; +} +.table.table-condensed tbody tr td { + padding-top: 12px; + padding-bottom: 12px; +} +.table.table-borderless tbody tr td { + border-top: 0; +} +.table tbody tr td { + background: #fff; + border-bottom: 1px solid rgba(230, 230, 230, 0.7); + border-top: 0px; + /* padding: 20px; */ + font-size: 13.5px; +} +.text-light { + font-weight: 300; +} +.text-normal { + font-weight: 400; +} +.text-medium, +strong { + font-weight: 500; +} +.text-bold { + font-weight: 700; +} +.text-ultra-bold { + font-weight: 900; +} +.txt-default { + color: #bac3d0 +} +.txt-primary { + color: #337ab7 +} +.txt-success { + color: #36c6d3 +} +.txt-info { + color: #659be0 +} +.txt-warning { + color: #F1C40F +} +.txt-danger { + color: #ed6b75 +} +.font-red { + color: #ff8080!important +} +.font-green { + color: #00ff00!important +} +.font-yellow { + color: #ffff80!important +} \ No newline at end of file diff --git a/bassets/admin/finallogo.png b/bassets/admin/finallogo.png new file mode 100644 index 0000000..b730e27 Binary files /dev/null and b/bassets/admin/finallogo.png differ diff --git a/bassets/admin/fonts/fontawesome-webfont3e6e.eot b/bassets/admin/fonts/fontawesome-webfont3e6e.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/bassets/admin/fonts/fontawesome-webfont3e6e.eot differ diff --git a/bassets/admin/fonts/fontawesome-webfont3e6e.svg b/bassets/admin/fonts/fontawesome-webfont3e6e.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/bassets/admin/fonts/fontawesome-webfont3e6e.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bassets/admin/fonts/fontawesome-webfont3e6e.ttf b/bassets/admin/fonts/fontawesome-webfont3e6e.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/bassets/admin/fonts/fontawesome-webfont3e6e.ttf differ diff --git a/bassets/admin/fonts/fontawesome-webfont3e6e.woff b/bassets/admin/fonts/fontawesome-webfont3e6e.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/bassets/admin/fonts/fontawesome-webfont3e6e.woff differ diff --git a/bassets/admin/fonts/fontawesome-webfont3e6e.woff2 b/bassets/admin/fonts/fontawesome-webfont3e6e.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/bassets/admin/fonts/fontawesome-webfont3e6e.woff2 differ diff --git a/bassets/admin/fonts/fontawesome-webfontd41d.eot b/bassets/admin/fonts/fontawesome-webfontd41d.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/bassets/admin/fonts/fontawesome-webfontd41d.eot differ diff --git a/bassets/admin/img/blog/blog1.jpg b/bassets/admin/img/blog/blog1.jpg new file mode 100644 index 0000000..b45c4f9 Binary files /dev/null and b/bassets/admin/img/blog/blog1.jpg differ diff --git a/bassets/admin/img/blog/blog2.jpg b/bassets/admin/img/blog/blog2.jpg new file mode 100644 index 0000000..b5a0dd4 Binary files /dev/null and b/bassets/admin/img/blog/blog2.jpg differ diff --git a/bassets/admin/img/blog/blog3.jpg b/bassets/admin/img/blog/blog3.jpg new file mode 100644 index 0000000..31ff30f Binary files /dev/null and b/bassets/admin/img/blog/blog3.jpg differ diff --git a/bassets/admin/img/blog/blog4.jpg b/bassets/admin/img/blog/blog4.jpg new file mode 100644 index 0000000..87a8fc3 Binary files /dev/null and b/bassets/admin/img/blog/blog4.jpg differ diff --git a/bassets/admin/img/datatable-row-openclose.html b/bassets/admin/img/datatable-row-openclose.html new file mode 100644 index 0000000..c87e78d --- /dev/null +++ b/bassets/admin/img/datatable-row-openclose.html @@ -0,0 +1,9 @@ + + +404 Not Found + +

Not Found

+

The requested URL /templates/admin/redstar/source/light/img/datatable-row-openclose.png was not found on this server.

+

Additionally, a 404 Not Found +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/bassets/admin/img/details_close.png b/bassets/admin/img/details_close.png new file mode 100644 index 0000000..9c7d698 Binary files /dev/null and b/bassets/admin/img/details_close.png differ diff --git a/bassets/admin/img/details_open.png b/bassets/admin/img/details_open.png new file mode 100644 index 0000000..c0edf44 Binary files /dev/null and b/bassets/admin/img/details_open.png differ diff --git a/bassets/admin/img/doc/doc1.jpg b/bassets/admin/img/doc/doc1.jpg new file mode 100644 index 0000000..16eabd4 Binary files /dev/null and b/bassets/admin/img/doc/doc1.jpg differ diff --git a/bassets/admin/img/doc/doc10.jpg b/bassets/admin/img/doc/doc10.jpg new file mode 100644 index 0000000..92e6d0c Binary files /dev/null and b/bassets/admin/img/doc/doc10.jpg differ diff --git a/bassets/admin/img/doc/doc2.jpg b/bassets/admin/img/doc/doc2.jpg new file mode 100644 index 0000000..7cbb066 Binary files /dev/null and b/bassets/admin/img/doc/doc2.jpg differ diff --git a/bassets/admin/img/doc/doc3.jpg b/bassets/admin/img/doc/doc3.jpg new file mode 100644 index 0000000..aabdd17 Binary files /dev/null and b/bassets/admin/img/doc/doc3.jpg differ diff --git a/bassets/admin/img/doc/doc4.jpg b/bassets/admin/img/doc/doc4.jpg new file mode 100644 index 0000000..cfe4f86 Binary files /dev/null and b/bassets/admin/img/doc/doc4.jpg differ diff --git a/bassets/admin/img/doc/doc5.jpg b/bassets/admin/img/doc/doc5.jpg new file mode 100644 index 0000000..dbe4912 Binary files /dev/null and b/bassets/admin/img/doc/doc5.jpg differ diff --git a/bassets/admin/img/doc/doc6.jpg b/bassets/admin/img/doc/doc6.jpg new file mode 100644 index 0000000..2880dac Binary files /dev/null and b/bassets/admin/img/doc/doc6.jpg differ diff --git a/bassets/admin/img/doc/doc7.jpg b/bassets/admin/img/doc/doc7.jpg new file mode 100644 index 0000000..c11e2eb Binary files /dev/null and b/bassets/admin/img/doc/doc7.jpg differ diff --git a/bassets/admin/img/doc/doc8.jpg b/bassets/admin/img/doc/doc8.jpg new file mode 100644 index 0000000..83cd4bc Binary files /dev/null and b/bassets/admin/img/doc/doc8.jpg differ diff --git a/bassets/admin/img/doc/doc9.jpg b/bassets/admin/img/doc/doc9.jpg new file mode 100644 index 0000000..8d58ef3 Binary files /dev/null and b/bassets/admin/img/doc/doc9.jpg differ diff --git a/bassets/admin/img/dp.jpg b/bassets/admin/img/dp.jpg new file mode 100644 index 0000000..4c72f64 Binary files /dev/null and b/bassets/admin/img/dp.jpg differ diff --git a/bassets/admin/img/favicon.ico b/bassets/admin/img/favicon.ico new file mode 100644 index 0000000..4f63327 Binary files /dev/null and b/bassets/admin/img/favicon.ico differ diff --git a/bassets/admin/img/favicon.png b/bassets/admin/img/favicon.png new file mode 100644 index 0000000..44320c3 Binary files /dev/null and b/bassets/admin/img/favicon.png differ diff --git a/bassets/admin/img/flags/de.png b/bassets/admin/img/flags/de.png new file mode 100644 index 0000000..ac4a977 Binary files /dev/null and b/bassets/admin/img/flags/de.png differ diff --git a/bassets/admin/img/flags/es.png b/bassets/admin/img/flags/es.png new file mode 100644 index 0000000..c2de2d7 Binary files /dev/null and b/bassets/admin/img/flags/es.png differ diff --git a/bassets/admin/img/flags/gb.png b/bassets/admin/img/flags/gb.png new file mode 100644 index 0000000..9d435f5 Binary files /dev/null and b/bassets/admin/img/flags/gb.png differ diff --git a/bassets/admin/img/flags/ru.png b/bassets/admin/img/flags/ru.png new file mode 100644 index 0000000..47da421 Binary files /dev/null and b/bassets/admin/img/flags/ru.png differ diff --git a/bassets/admin/img/flags/ua.png b/bassets/admin/img/flags/ua.png new file mode 100644 index 0000000..09563a2 Binary files /dev/null and b/bassets/admin/img/flags/ua.png differ diff --git a/bassets/admin/img/hospital.png b/bassets/admin/img/hospital.png new file mode 100644 index 0000000..c6e0052 Binary files /dev/null and b/bassets/admin/img/hospital.png differ diff --git a/bassets/admin/img/invoice_logo.png b/bassets/admin/img/invoice_logo.png new file mode 100644 index 0000000..a702878 Binary files /dev/null and b/bassets/admin/img/invoice_logo.png differ diff --git a/bassets/admin/img/mega-img1.jpg b/bassets/admin/img/mega-img1.jpg new file mode 100644 index 0000000..128bf43 Binary files /dev/null and b/bassets/admin/img/mega-img1.jpg differ diff --git a/bassets/admin/img/mega-img2.jpg b/bassets/admin/img/mega-img2.jpg new file mode 100644 index 0000000..633c79b Binary files /dev/null and b/bassets/admin/img/mega-img2.jpg differ diff --git a/bassets/admin/img/mega-img3.jpg b/bassets/admin/img/mega-img3.jpg new file mode 100644 index 0000000..bb77a3a Binary files /dev/null and b/bassets/admin/img/mega-img3.jpg differ diff --git a/bassets/admin/img/patient1.jpg b/bassets/admin/img/patient1.jpg new file mode 100644 index 0000000..5942b42 Binary files /dev/null and b/bassets/admin/img/patient1.jpg differ diff --git a/bassets/admin/img/process.gif b/bassets/admin/img/process.gif new file mode 100644 index 0000000..647134a Binary files /dev/null and b/bassets/admin/img/process.gif differ diff --git a/bassets/admin/img/remove-icon-small.png b/bassets/admin/img/remove-icon-small.png new file mode 100644 index 0000000..382bb24 Binary files /dev/null and b/bassets/admin/img/remove-icon-small.png differ diff --git a/bassets/admin/img/slider/fullimage1.jpg b/bassets/admin/img/slider/fullimage1.jpg new file mode 100644 index 0000000..7fc820a Binary files /dev/null and b/bassets/admin/img/slider/fullimage1.jpg differ diff --git a/bassets/admin/img/slider/fullimage2.jpg b/bassets/admin/img/slider/fullimage2.jpg new file mode 100644 index 0000000..594f313 Binary files /dev/null and b/bassets/admin/img/slider/fullimage2.jpg differ diff --git a/bassets/admin/img/slider/fullimage3.jpg b/bassets/admin/img/slider/fullimage3.jpg new file mode 100644 index 0000000..26c5845 Binary files /dev/null and b/bassets/admin/img/slider/fullimage3.jpg differ diff --git a/bassets/admin/img/slider/owl1.jpg b/bassets/admin/img/slider/owl1.jpg new file mode 100644 index 0000000..56f8448 Binary files /dev/null and b/bassets/admin/img/slider/owl1.jpg differ diff --git a/bassets/admin/img/slider/owl2.jpg b/bassets/admin/img/slider/owl2.jpg new file mode 100644 index 0000000..0b4ee33 Binary files /dev/null and b/bassets/admin/img/slider/owl2.jpg differ diff --git a/bassets/admin/img/slider/owl3.jpg b/bassets/admin/img/slider/owl3.jpg new file mode 100644 index 0000000..3a0491f Binary files /dev/null and b/bassets/admin/img/slider/owl3.jpg differ diff --git a/bassets/admin/img/slider/owl4.jpg b/bassets/admin/img/slider/owl4.jpg new file mode 100644 index 0000000..1ad1f63 Binary files /dev/null and b/bassets/admin/img/slider/owl4.jpg differ diff --git a/bassets/admin/img/slider/owl5.jpg b/bassets/admin/img/slider/owl5.jpg new file mode 100644 index 0000000..2478aee Binary files /dev/null and b/bassets/admin/img/slider/owl5.jpg differ diff --git a/bassets/admin/img/slider/owl6.jpg b/bassets/admin/img/slider/owl6.jpg new file mode 100644 index 0000000..707641c Binary files /dev/null and b/bassets/admin/img/slider/owl6.jpg differ diff --git a/bassets/admin/img/slider/owl7.jpg b/bassets/admin/img/slider/owl7.jpg new file mode 100644 index 0000000..665b944 Binary files /dev/null and b/bassets/admin/img/slider/owl7.jpg differ diff --git a/bassets/admin/img/slider/owl8.jpg b/bassets/admin/img/slider/owl8.jpg new file mode 100644 index 0000000..3a0491f Binary files /dev/null and b/bassets/admin/img/slider/owl8.jpg differ diff --git a/bassets/admin/img/slider/slider1.jpg b/bassets/admin/img/slider/slider1.jpg new file mode 100644 index 0000000..dea929c Binary files /dev/null and b/bassets/admin/img/slider/slider1.jpg differ diff --git a/bassets/admin/img/slider/slider2.jpg b/bassets/admin/img/slider/slider2.jpg new file mode 100644 index 0000000..d0f67c7 Binary files /dev/null and b/bassets/admin/img/slider/slider2.jpg differ diff --git a/bassets/admin/img/slider/slider3.jpg b/bassets/admin/img/slider/slider3.jpg new file mode 100644 index 0000000..7494e56 Binary files /dev/null and b/bassets/admin/img/slider/slider3.jpg differ diff --git a/bassets/admin/img/user/user1.jpg b/bassets/admin/img/user/user1.jpg new file mode 100644 index 0000000..1153659 Binary files /dev/null and b/bassets/admin/img/user/user1.jpg differ diff --git a/bassets/admin/img/user/user10.jpg b/bassets/admin/img/user/user10.jpg new file mode 100644 index 0000000..a9e0d4f Binary files /dev/null and b/bassets/admin/img/user/user10.jpg differ diff --git a/bassets/admin/img/user/user2.jpg b/bassets/admin/img/user/user2.jpg new file mode 100644 index 0000000..33fd045 Binary files /dev/null and b/bassets/admin/img/user/user2.jpg differ diff --git a/bassets/admin/img/user/user3.jpg b/bassets/admin/img/user/user3.jpg new file mode 100644 index 0000000..0203cea Binary files /dev/null and b/bassets/admin/img/user/user3.jpg differ diff --git a/bassets/admin/img/user/user4.jpg b/bassets/admin/img/user/user4.jpg new file mode 100644 index 0000000..a9e0d4f Binary files /dev/null and b/bassets/admin/img/user/user4.jpg differ diff --git a/bassets/admin/img/user/user5.jpg b/bassets/admin/img/user/user5.jpg new file mode 100644 index 0000000..e5532e9 Binary files /dev/null and b/bassets/admin/img/user/user5.jpg differ diff --git a/bassets/admin/img/user/user6.jpg b/bassets/admin/img/user/user6.jpg new file mode 100644 index 0000000..b163094 Binary files /dev/null and b/bassets/admin/img/user/user6.jpg differ diff --git a/bassets/admin/img/user/user7.jpg b/bassets/admin/img/user/user7.jpg new file mode 100644 index 0000000..6751888 Binary files /dev/null and b/bassets/admin/img/user/user7.jpg differ diff --git a/bassets/admin/img/user/user8.jpg b/bassets/admin/img/user/user8.jpg new file mode 100644 index 0000000..178646b Binary files /dev/null and b/bassets/admin/img/user/user8.jpg differ diff --git a/bassets/admin/img/user/user9.jpg b/bassets/admin/img/user/user9.jpg new file mode 100644 index 0000000..19dd85d Binary files /dev/null and b/bassets/admin/img/user/user9.jpg differ diff --git a/bassets/admin/js/jquery.cookie.min.js b/bassets/admin/js/jquery.cookie.min.js new file mode 100644 index 0000000..c0f19d8 --- /dev/null +++ b/bassets/admin/js/jquery.cookie.min.js @@ -0,0 +1,2 @@ +/*! jquery.cookie v1.4.1 | MIT */ +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}}); \ No newline at end of file diff --git a/bassets/app.js b/bassets/app.js new file mode 100644 index 0000000..a75572a --- /dev/null +++ b/bassets/app.js @@ -0,0 +1,757 @@ +/** + * Document : app.js + * Author : redstar + * Description: Core script to handle the entire theme and core functions + * + **/ +var App = function() { + + // IE mode + var isIE8 = false; + var isIE9 = false; + var isIE10 = false; + + var resizeHandlers = []; + + var assetsPath = ''; + + var globalImgPath = 'img/'; + + var globalPluginsPath = 'global/plugins/'; + + var globalCssPath = 'css/'; + + /************* Setting for IE ****************/ + var handleInit = function() { + + + isIE8 = !!navigator.userAgent.match(/MSIE 8.0/); + isIE9 = !!navigator.userAgent.match(/MSIE 9.0/); + isIE10 = !!navigator.userAgent.match(/MSIE 10.0/); + + if (isIE10) { + $('html').addClass('ie10'); // detect IE10 version + } + + if (isIE10 || isIE9 || isIE8) { + $('html').addClass('ie'); // detect IE10 version + } + }; + + /*************** Change theme color *************/ + var handleColorSetting = function() { + + $(document).on('click', '.control-sidebar-btn', function () { + jQuery( ".quick-setting" ).toggle( "slide"); + }); + + }; + + /*************** Change Language *************/ + var handleLanguage = function() { + + $(document).on('click', '.language-switch .dropdown-menu li a', function () { + $(".language-switch>a").html($(this).html()+''); + $(".language-switch>a img").addClass("position-left"); + }); + + }; + /*************** Hover Sidemenu *************/ + var handleHoverSidemenu = function() { + $(".sidemenu-hover-submenu").parent().parent().css("position","relative"); + }; + + /************* Handle theme layout ****************/ + var handleTheme = function() { + + var panel = $('.chatpane'); + + if ($('body').hasClass('page-boxed') === false) { + $('.layout-option', panel).val("fluid"); + } + + $('.sidebar-option', panel).val("default"); + $('.page-header-option', panel).val("fixed"); + $('.page-footer-option', panel).val("default"); + if ($('.sidebar-pos-option').attr("disabled") === false) { + $('.sidebar-pos-option', panel).val('left'); + } + var lastSelectedLayout = ''; + + var setLayout = function() { + + var layoutOption = $('.layout-option', panel).val(); + var sidebarOption = $('.sidebar-option', panel).val(); + var headerOption = $('.page-header-option', panel).val(); + var footerOption = $('.page-footer-option', panel).val(); + var sidebarPosOption = $('.sidebar-pos-option', panel).val(); + var sidebarStyleOption = $('.sidebar-style-option', panel).val(); + var sidebarMenuOption = $('.sidebar-menu-option', panel).val(); + var headerTopDropdownStyle = $('.page-header-top-dropdown-style-option', panel).val(); + + if (sidebarOption == "fixed" && headerOption == "default") { + alert('Default Header with Fixed Sidebar option is not supported. Proceed with Fixed Header with Fixed Sidebar.'); + $('.page-header-option', panel).val("fixed"); + $('.sidebar-option', panel).val("fixed"); + sidebarOption = 'fixed'; + headerOption = 'fixed'; + } + + resetLayout(); // reset layout to default state + + if (layoutOption === "boxed") { + $("body").addClass("page-boxed"); + + // set header + $('.page-header > .page-header-inner').addClass("container"); + var cont = $('body > .clearfix').after('
'); + + // set content + $('.page-container').appendTo('body > .container'); + + // set footer + if (footerOption === 'fixed') { + $('.page-footer').html('
' + $('.page-footer').html() + '
'); + } else { + $('.page-footer').appendTo('body > .container'); + } + } + + if (lastSelectedLayout != layoutOption) { + //layout changed, run responsive handler: + App.runResizeHandlers(); + } + lastSelectedLayout = layoutOption; + + /************ header ******************/ + if (headerOption === 'fixed') { + $("body").addClass("page-header-fixed"); + $(".page-header").removeClass("navbar-static-top").addClass("navbar-fixed-top"); + } else { + $("body").removeClass("page-header-fixed"); + $(".page-header").removeClass("navbar-fixed-top").addClass("navbar-static-top"); + } + + /************ sidebar *****************/ + if ($('body').hasClass('page-full-width') === false) { + if (sidebarOption === 'fixed') { + $("body").addClass("sidemenu-container-fixed"); + $("sidemenu").addClass("sidemenu-fixed"); + $("sidemenu").removeClass("page-sidebar-menu-default"); + Layout.initFixedSidebarHoverEffect(); + } else { + $("body").removeClass("sidemenu-container-fixed"); + $("page-sidebar-menu").addClass("page-sidebar-menu-default"); + $("page-sidebar-menu").removeClass("sidemenu-default"); + $('.sidemenu').unbind('mouseenter').unbind('mouseleave'); + } + } + + /********* top dropdown style ************/ + if (headerTopDropdownStyle === 'dark') { + $(".top-menu > .navbar-nav > li.dropdown").addClass("dropdown-dark"); + } else { + $(".top-menu > .navbar-nav > li.dropdown").removeClass("dropdown-dark"); + } + + /************* footer ****************/ + if (footerOption === 'fixed') { + $("body").addClass("page-footer-fixed"); + } else { + $("body").removeClass("page-footer-fixed"); + } + + /*********** sidebar style ***************/ + if (sidebarStyleOption === 'light') { + $(".page-sidebar-menu").addClass("page-sidebar-menu-light"); + } else { + $(".page-sidebar-menu").removeClass("page-sidebar-menu-light"); + } + + /********* sidebar menu ***********************/ + if (sidebarMenuOption === 'hover') { + if (sidebarOption == 'fixed') { + $('.sidebar-menu-option', panel).val("accordion"); + alert("Hover Sidebar Menu is not compatible with Fixed Sidebar Mode. Select Default Sidebar Mode Instead."); + } else { + $(".sidemenu").addClass("sidemenu-hover-submenu"); + } + } else { + $(".sidemenu").removeClass("sidemenu-hover-submenu"); + } + + /**************** sidebar left right position setting **************/ + if (sidebarPosOption === 'right') { + $("body").addClass("sidemenu-container-reversed"); + $('#frontend-link').tooltip('destroy').tooltip({ + placement: 'left' + }); + } else { + $("body").removeClass("sidemenu-container-reversed"); + $('#frontend-link').tooltip('destroy').tooltip({ + placement: 'right' + }); + } + + Layout.fixContentHeight(); // fix content height + Layout.initFixedSidebar(); // reinitialize fixed sidebar + }; + + $(document).on('click', '.toggler', panel, function() { + $('.toggler').hide(); + $('.toggler-close').show(); + $('.chatpane > .theme-options').show(); + }); + + $(document).on('click', '.toggler-close', panel, function() { + $('.toggler').show(); + $('.toggler-close').hide(); + $('.chatpane > .theme-options').hide(); + }); + + /*************** spinner button ******************/ + $(document).on('click', '.spinner button', function() { + var btn = $(this); + var input = btn.closest('.spinner').find('input'); + var step = 1; + if (input.attr('step') != undefined) { + step = parseInt(input.attr('step'),10); + } + if (btn.attr('data-dir') == 'up') { + if (input.attr('max') == undefined || parseInt(input.val(),10) < parseInt(input.attr('max'),10)) { + input.val(parseInt(input.val(), 10) + step); + } else { + btn.next("disabled", true); + } + } else { + if (input.attr('min') == undefined || parseInt(input.val(),10) > parseInt(input.attr('min'),10)) { + input.val(parseInt(input.val(), 10) - step); + } else { + btn.prev("disabled", true); + } + } + }); + + /*************** TO DO **********************/ + $(document).on('click', '.todo-check label', function() { + $(this).parents('li').children('.todo-title').toggleClass('line-through'); + }); + $(document).on('click', '.todo-remove', function() { + $(this).closest("li").remove(); + return false; + }); + + $(document).on('click', '.panel .tools .fa-times', function() { + $(this).parents(".panel").parent().remove(); + }); + $('.tooltips').tooltip(); + + // clickable row for email + $(document).on('click', '.clickable-row', function() { + window.document.location = $(this).data("link"); + }); + + + /************* collapse button in panel***************8*/ + $(document).on('click', '.card .tools .t-collapse', function() { + var el = $(this).parents(".card").children(".card-body"); + if ($(this).hasClass("fa-chevron-down")) { + $(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); + el.slideUp(200); + } else { + $(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); + el.slideDown(200); + } + }); + + /**************** close button in panel *****************/ + $(document).on('click', '.card .tools .t-close', function() { + $(this).parents(".card").parent().remove(); + }); + + /****************** refresh button in panel *****************/ + $('.box-refresh').on('click', function(br) { + br.preventDefault(); + $("
").appendTo($(this).parents('.tools').parents('.card-head').parents('.card')); + setTimeout(function() { + $('.refresh-block').remove(); + }, 1000); + }); + + /***************** set default theme options **************************/ + + if ($("body").hasClass("page-boxed")) { + $('.layout-option', panel).val("boxed"); + } + + if ($("body").hasClass("sidemenu-container-fixed")) { + $('.sidebar-option', panel).val("fixed"); + } + + if ($("body").hasClass("page-header-fixed")) { + $('.page-header-option', panel).val("fixed"); + } + + if ($("body").hasClass("page-footer-fixed")) { + $('.page-footer-option', panel).val("fixed"); + } + + if ($("body").hasClass("sidemenu-container-reversed")) { + $('.sidebar-pos-option', panel).val("right"); + } + + if ($(".page-sidebar-menu").hasClass("page-sidebar-menu-light")) { + $('.sidebar-style-option', panel).val("light"); + } + + if ($(".page-sidebar-menu").hasClass("page-sidebar-menu-hover-submenu")) { + $('.sidebar-menu-option', panel).val("hover"); + } + + var sidebarOption = $('.sidebar-option', panel).val(); + var headerOption = $('.page-header-option', panel).val(); + var footerOption = $('.page-footer-option', panel).val(); + var sidebarPosOption = $('.sidebar-pos-option', panel).val(); + var sidebarStyleOption = $('.sidebar-style-option', panel).val(); + var sidebarMenuOption = $('.sidebar-menu-option', panel).val(); + + $('.layout-option, .page-header-option, .page-header-top-dropdown-style-option, .sidebar-option, .page-footer-option, .sidebar-pos-option, .sidebar-style-option, .sidebar-menu-option', panel).change(setLayout); + }; + + /************ Reset theme layout ********************/ + var resetLayout = function() { + $("body"). + removeClass("page-boxed"). + removeClass("page-footer-fixed"). + removeClass("sidemenu-container-fixed"). + removeClass("page-header-fixed"). + removeClass("sidemenu-container-reversed"); + + $('.page-header > .page-header-inner').removeClass("container"); + + if ($('.page-container').parent(".container").length === 1) { + $('.page-container').insertAfter('body > .clearfix'); + } + + if ($('.page-footer > .container').length === 1) { + $('.page-footer').html($('.page-footer > .container').html()); + } else if ($('.page-footer').parent(".container").length === 1) { + $('.page-footer').insertAfter('.page-container'); + $('.scroll-to-top').insertAfter('.page-footer'); + } + + $(".top-menu > .navbar-nav > li.dropdown").removeClass("dropdown-dark"); + + $('body > .container').remove(); + }; + + + // runs callback functions set by App.addResponsiveHandler(). + var _runResizeHandlers = function() { + // reinitialize other subscribed elements + for (var i = 0; i < resizeHandlers.length; i++) { + var each = resizeHandlers[i]; + each.call(); + } + }; + + /********** handle the layout reinitialization on window resize ***********/ + var handleOnResize = function() { + var resize; + if (isIE8) { + var currheight; + $(window).resize(function() { + if (currheight == document.documentElement.clientHeight) { + return; //quite event since only body resized not window. + } + if (resize) { + clearTimeout(resize); + } + resize = setTimeout(function() { + _runResizeHandlers(); + }, 50); // wait 50ms until window resize finishes. + currheight = document.documentElement.clientHeight; // store last body client height + }); + } else { + $(window).resize(function() { + if (resize) { + clearTimeout(resize); + } + resize = setTimeout(function() { + _runResizeHandlers(); + }, 50); // wait 50ms until window resize finishes. + }); + } + }; + + /*************** Handles Bootstrap switches in setting panel ********/ + var handleBootstrapSwitch = function() { + if (!$().bootstrapSwitch) { + return; + } + $('.make-switch').bootstrapSwitch(); + }; + + /*************** Handles Bootstrap Tabs **********************/ + var handleTabs = function() { + //activate tab if tab id provided in the URL + if (encodeURI(location.hash)) { + var tabid = encodeURI(location.hash.substr(1)); + $('a[href="#' + tabid + '"]').parents('.tab-pane:hidden').each(function() { + var tabid = $(this).attr("id"); + $('a[href="#' + tabid + '"]').click(); + }); + $('a[href="#' + tabid + '"]').click(); + } + + if ($().tabdrop) { + $('.tabbable-tabdrop .nav-pills, .tabbable-tabdrop .nav-tabs').tabdrop({ + text: ' ' + }); + } + }; + + /************* Handles Bootstrap Dropdowns ********************/ + var handleDropdowns = function() { + /* + Hold dropdown on click + */ + $('body').on('click', '.dropdown-menu.hold-on-click', function(e) { + e.stopPropagation(); + }); + }; + + /************** Handles counterup plugin wrapper ****************/ + var handleCounterup = function() { + if (!$().counterUp) { + return; + } + + $("[data-counter='counterup']").counterUp({ + delay: 10, + time: 1000 + }); + }; + + // Fix input placeholder issue for IE8 and IE9 + var handleFixInputPlaceholderForIE = function() { + //fix html5 placeholder attribute for ie7 & ie8 + if (isIE8 || isIE9) { // ie8 & ie9 + // this is html5 placeholder fix for inputs, inputs with placeholder-no-fix class will be skipped(e.g: we need this for password fields) + $('input[placeholder]:not(.placeholder-no-fix), textarea[placeholder]:not(.placeholder-no-fix)').each(function() { + var input = $(this); + + if (input.val() === '' && input.attr("placeholder") !== '') { + input.addClass("placeholder").val(input.attr('placeholder')); + } + + input.focus(function() { + if (input.val() == input.attr('placeholder')) { + input.val(''); + } + }); + + input.blur(function() { + if (input.val() === '' || input.val() == input.attr('placeholder')) { + input.val(input.attr('placeholder')); + } + }); + }); + } + }; + + // Handle Select2 Dropdowns + var handleSelect2 = function() { + if ($().select2) { + $.fn.select2.defaults.set("theme", "bootstrap"); + $('.select2me').select2({ + placeholder: "Select", + width: 'auto', + allowClear: true + }); + } + }; + + // handle group element heights + var handleHeight = function() { + $('[data-auto-height]').each(function() { + var parent = $(this); + var items = $('[data-height]', parent); + var height = 0; + var mode = parent.attr('data-mode'); + var data_offset = parent.attr('data-offset') ? parent.attr('data-offset') : 0; + var offset = parseInt(data_offset,10); + + items.each(function() { + if ($(this).attr('data-height') == "height") { + $(this).css('height', ''); + } else { + $(this).css('min-height', ''); + } + + var height_ = (mode == 'base-height' ? $(this).outerHeight() : $(this).outerHeight(true)); + if (height_ > height) { + height = height_; + } + }); + + height = height + offset; + + items.each(function() { + if ($(this).attr('data-height') == "height") { + $(this).css('height', height); + } else { + $(this).css('min-height', height); + } + }); + + if (parent.attr('data-related')) { + $(parent.attr('data-related')).css('height', parent.height()); + } + }); + } + + // Handles quick sidebar toggler + var handleQuickSidebarToggler = function() { + // close sidebar using button click + $(document).on('click', '.dropdown-quick-sidebar-toggler a', function(e) { + $('body').toggleClass('chat-sidebar-open'); + }); + // close sidebar when click outside box + $(document).on('click', '.page-content', function(e) { + if($("body").hasClass("chat-sidebar-open")){ + $('body').toggleClass('chat-sidebar-open'); + } + }); + // close sidebar using esc key + $( document ).on( 'keydown', function ( e ) { + if ( e.keyCode === 27 && $("body").hasClass("chat-sidebar-open")) { // ESC + $('body').toggleClass('chat-sidebar-open'); + } + }); + }; + + /********Sidebar slim-menu*********/ + var handleslimscroll_menu = function() { + $(".slimscroll-style").slimscroll({ + height: $( window ).height() - 90, + position: "right", + size: "5px", + color: "#9ea5ab", + wheelStep: 5 + }); + $(".small-slimscroll-style").slimscroll({ + height: "260px", + position: "right", + size: "5px", + color: "#9ea5ab", + wheelStep: 5 + }); + }; + + handleChatScrollbar = function() { + var t = $(".chat-sidebar-chat"), + i = function() { + var i, a = t.find(".chat-sidebar-item"), + e = $(".chat-sidebar-chat-users").attr("data-height"); + i = $(".chat-sidebar-chat-users").attr("data-height") - 80 - t.find(".nav-justified > .nav-tabs").outerHeight(), a.attr("data-height", i), a.css("height", e + "px"), a.css("overflow-y", "auto") + }; + i(), App.addResizeHandler(i) + }; + + // Handles quick sidebar settings + var handleQuickSidebarSettings = function() { + var wrapper = $('.chat-sidebar-container'); + + var initSettingsSlimScroll = function() { + var settingsList = wrapper.find('.chat-sidebar-settings-list'); + var settingsListHeight; + + settingsListHeight = wrapper.height() - 80 - wrapper.find('.nav-justified > .nav-tabs').outerHeight(); + + // alerts list + settingsList.attr("data-height", settingsListHeight); + settingsList.css("height", wrapper.height() + "px"); + settingsList.css("overflow-y", "auto"); + }; + + initSettingsSlimScroll(); + App.addResizeHandler(initSettingsSlimScroll); // reinitialize on window resize + }; + + + + //* END:CORE HANDLERS *// + + return { + + //main function to initiate the theme + init: function() { + + //Core handlers + handleInit(); // initialize core variables + handleTheme(); + handleOnResize(); // set and handle responsive + handleColorSetting(); + handleLanguage(); + handleHoverSidemenu(); + + //UI Component handlers + handleBootstrapSwitch(); // handle bootstrap switch plugin + handleSelect2(); // handle custom Select2 dropdowns + handleDropdowns(); // handle dropdowns + handleTabs(); // handle tabs + handleCounterup(); // handle counterup instances + + handleQuickSidebarToggler(); // handles quick sidebar's toggler + handleQuickSidebarSettings(); // handles quick sidebar's setting + handleChatScrollbar(); + + handleslimscroll_menu(); + + //Handle group element heights + this.addResizeHandler(handleHeight); // handle auto calculating height on window resize + + handleFixInputPlaceholderForIE(); //IE8 & IE9 input placeholder issue fix + }, + + //public function to add callback a function which will be called on window resize + addResizeHandler: function(func) { + resizeHandlers.push(func); + }, + + //public functon to call _runresizeHandlers + runResizeHandlers: function() { + _runResizeHandlers(); + }, + + // wrApper function to scroll(focus) to an element + scrollTo: function(el, offeset) { + var pos = (el && el.length > 0) ? el.offset().top : 0; + + if (el) { + if ($('body').hasClass('page-header-fixed')) { + pos = pos - $('.page-header').height(); + } else if ($('body').hasClass('page-header-top-fixed')) { + pos = pos - $('.page-header-top').height(); + } else if ($('body').hasClass('page-header-menu-fixed')) { + pos = pos - $('.page-header-menu').height(); + } + pos = pos + (offeset ? offeset : -1 * el.height()); + } + + $('html,body').animate({ + scrollTop: pos + }, 'slow'); + }, + // function to scroll to the top + scrollTop: function() { + App.scrollTo(); + }, + + startPageLoading: function(options) { + if (options && options.animate) { + $('.page-spinner-bar').remove(); + $('body').append('
'); + } else { + $('.page-loading').remove(); + $('body').append('
  ' + (options && options.message ? options.message : 'Loading...') + '
'); + } + }, + + stopPageLoading: function() { + $('.page-loading, .page-spinner-bar').remove(); + }, + + //public helper function to get actual input value(used in IE9 and IE8 due to placeholder attribute not supported) + getActualVal: function(el) { + el = $(el); + if (el.val() === el.attr("placeholder")) { + return ""; + } + return el.val(); + }, + + //public function to get a paremeter by name from URL + getURLParameter: function(paramName) { + var searchString = window.location.search.substring(1), + i, val, params = searchString.split("&"); + + for (i = 0; i < params.length; i++) { + val = params[i].split("="); + if (val[0] == paramName) { + return unescape(val[1]); + } + } + return null; + }, + + getViewPort: function() { + var e = window, + a = 'inner'; + if (!('innerWidth' in window)) { + a = 'client'; + e = document.documentElement || document.body; + } + + return { + width: e[a + 'Width'], + height: e[a + 'Height'] + }; + }, + + getUniqueID: function(prefix) { + return 'prefix_' + Math.floor(Math.random() * (new Date()).getTime()); + }, + + // check IE8 mode + isIE8: function() { + return isIE8; + }, + + // check IE9 mode + isIE9: function() { + return isIE9; + }, + + getAssetsPath: function() { + return assetsPath; + }, + + setAssetsPath: function(path) { + assetsPath = path; + }, + + setGlobalImgPath: function(path) { + globalImgPath = path; + }, + + getGlobalImgPath: function() { + return assetsPath + globalImgPath; + }, + + getGlobalCssPath: function() { + return assetsPath + globalCssPath; + }, + + getResponsiveBreakpoint: function(size) { + // bootstrap responsive breakpoints + var sizes = { + 'xs': 480, // extra small + 'sm': 768, // small + 'md': 992, // medium + 'lg': 1200 // large + }; + + return sizes[size] ? sizes[size] : 0; + } + }; + +}(); + +jQuery(document).ready(function() { + App.init(); // init core componets + $(".chat-sidebar-chat-user-messages").animate({ + scrollTop: $(document).height() + }, 1000); +}); \ No newline at end of file diff --git a/bassets/bootstrap-colorpicker/css/bootstrap-colorpicker.css b/bassets/bootstrap-colorpicker/css/bootstrap-colorpicker.css new file mode 100644 index 0000000..c446ef8 --- /dev/null +++ b/bassets/bootstrap-colorpicker/css/bootstrap-colorpicker.css @@ -0,0 +1,222 @@ +/*! + * Bootstrap Colorpicker v2.3.6 + * https://itsjavi.com/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */ +.colorpicker-saturation { + width: 100px; + height: 100px; + background-image: url("../img/bootstrap-colorpicker/saturation.png"); + cursor: crosshair; + float: left; +} +.colorpicker-saturation i { + display: block; + height: 5px; + width: 5px; + border: 1px solid #000; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + position: absolute; + top: 0; + left: 0; + margin: -4px 0 0 -4px; +} +.colorpicker-saturation i b { + display: block; + height: 5px; + width: 5px; + border: 1px solid #fff; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.colorpicker-hue, +.colorpicker-alpha { + width: 15px; + height: 100px; + float: left; + cursor: row-resize; + margin-left: 4px; + margin-bottom: 4px; +} +.colorpicker-hue i, +.colorpicker-alpha i { + display: block; + height: 1px; + background: #000; + border-top: 1px solid #fff; + position: absolute; + top: 0; + left: 0; + width: 100%; + margin-top: -1px; +} +.colorpicker-hue { + background-image: url("../img/bootstrap-colorpicker/hue.png"); +} +.colorpicker-alpha { + background-image: url("../img/bootstrap-colorpicker/alpha.png"); + display: none; +} +.colorpicker-saturation, +.colorpicker-hue, +.colorpicker-alpha { + background-size: contain; +} +.colorpicker { + padding: 4px; + min-width: 130px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + z-index: 2500; +} +.colorpicker:before, +.colorpicker:after { + display: table; + content: ""; + line-height: 0; +} +.colorpicker:after { + clear: both; +} +.colorpicker:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 6px; +} +.colorpicker:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 7px; +} +.colorpicker div { + position: relative; +} +.colorpicker.colorpicker-with-alpha { + min-width: 140px; +} +.colorpicker.colorpicker-with-alpha .colorpicker-alpha { + display: block; +} +.colorpicker-color { + height: 10px; + margin-top: 5px; + clear: both; + background-image: url("../img/bootstrap-colorpicker/alpha.png"); + background-position: 0 100%; +} +.colorpicker-color div { + height: 10px; +} +.colorpicker-selectors { + display: none; + height: 10px; + margin-top: 5px; + clear: both; +} +.colorpicker-selectors i { + cursor: pointer; + float: left; + height: 10px; + width: 10px; +} +.colorpicker-selectors i + i { + margin-left: 3px; +} +.colorpicker-element .input-group-addon i, +.colorpicker-element .add-on i { + display: inline-block; + cursor: pointer; + height: 16px; + vertical-align: text-top; + width: 16px; +} +.colorpicker.colorpicker-inline { + position: relative; + display: inline-block; + float: none; + z-index: auto; +} +.colorpicker.colorpicker-horizontal { + width: 110px; + min-width: 110px; + height: auto; +} +.colorpicker.colorpicker-horizontal .colorpicker-saturation { + margin-bottom: 4px; +} +.colorpicker.colorpicker-horizontal .colorpicker-color { + width: 100px; +} +.colorpicker.colorpicker-horizontal .colorpicker-hue, +.colorpicker.colorpicker-horizontal .colorpicker-alpha { + width: 100px; + height: 15px; + float: left; + cursor: col-resize; + margin-left: 0px; + margin-bottom: 4px; +} +.colorpicker.colorpicker-horizontal .colorpicker-hue i, +.colorpicker.colorpicker-horizontal .colorpicker-alpha i { + display: block; + height: 15px; + background: #ffffff; + position: absolute; + top: 0; + left: 0; + width: 1px; + border: none; + margin-top: 0px; +} +.colorpicker.colorpicker-horizontal .colorpicker-hue { + background-image: url("../img/bootstrap-colorpicker/hue-horizontal.png"); +} +.colorpicker.colorpicker-horizontal .colorpicker-alpha { + background-image: url("../img/bootstrap-colorpicker/alpha-horizontal.png"); +} +.colorpicker.colorpicker-hidden { + display: none; +} +.colorpicker.colorpicker-visible { + display: block; +} +.colorpicker-inline.colorpicker-visible { + display: inline-block; +} +.colorpicker-right:before { + left: auto; + right: 6px; +} +.colorpicker-right:after { + left: auto; + right: 7px; +} +.colorpicker-no-arrow:before { + border-right: 0; + border-left: 0; +} +.colorpicker-no-arrow:after { + border-right: 0; + border-left: 0; +} +/*# sourceMappingURL=bootstrap-colorpicker.css.map */ \ No newline at end of file diff --git a/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png new file mode 100644 index 0000000..f831889 Binary files /dev/null and b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png differ diff --git a/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha.png b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha.png new file mode 100644 index 0000000..2e53a30 Binary files /dev/null and b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/alpha.png differ diff --git a/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/hue-horizontal.png b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/hue-horizontal.png new file mode 100644 index 0000000..3dcd594 Binary files /dev/null and b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/hue-horizontal.png differ diff --git a/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/hue.png b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/hue.png new file mode 100644 index 0000000..6f5ec2e Binary files /dev/null and b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/hue.png differ diff --git a/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/saturation.png b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/saturation.png new file mode 100644 index 0000000..170841c Binary files /dev/null and b/bassets/bootstrap-colorpicker/img/bootstrap-colorpicker/saturation.png differ diff --git a/bassets/bootstrap-colorpicker/js/bootstrap-colorpicker-init.js b/bassets/bootstrap-colorpicker/js/bootstrap-colorpicker-init.js new file mode 100644 index 0000000..eed6bdb --- /dev/null +++ b/bassets/bootstrap-colorpicker/js/bootstrap-colorpicker-init.js @@ -0,0 +1,3 @@ +$(function() { $('#colorinput1').colorpicker({ color: "", format: "hex" }); }); +$(function() { $('#colorinput2').colorpicker({ color: "#AA3399", format: "rgba"}); }); +$(function() { $('#cp1').colorpicker(); }); \ No newline at end of file diff --git a/bassets/bootstrap-colorpicker/js/bootstrap-colorpicker.js b/bassets/bootstrap-colorpicker/js/bootstrap-colorpicker.js new file mode 100644 index 0000000..0fa68ba --- /dev/null +++ b/bassets/bootstrap-colorpicker/js/bootstrap-colorpicker.js @@ -0,0 +1,1322 @@ +/*! + * Bootstrap Colorpicker v2.5.2 + * https://itsjavi.com/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */ + +(function(root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module unless amdModuleId is set + define(["jquery"], function(jq) { + return (factory(jq)); + }); + } else if (typeof exports === 'object') { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(require("jquery")); + } else if (jQuery && !jQuery.fn.colorpicker) { + factory(jQuery); + } +}(this, function($) { + 'use strict'; + /** + * Color manipulation helper class + * + * @param {Object|String} [val] + * @param {Object} [predefinedColors] + * @param {String|null} [fallbackColor] + * @param {String|null} [fallbackFormat] + * @param {Boolean} [hexNumberSignPrefix] + * @constructor + */ + var Color = function( + val, predefinedColors, fallbackColor, fallbackFormat, hexNumberSignPrefix) { + this.fallbackValue = fallbackColor ? + ( + (typeof fallbackColor === 'string') ? + this.parse(fallbackColor) : + fallbackColor + ) : + null; + + this.fallbackFormat = fallbackFormat ? fallbackFormat : 'rgba'; + + this.hexNumberSignPrefix = hexNumberSignPrefix === true; + + this.value = this.fallbackValue; + + this.origFormat = null; // original string format + + this.predefinedColors = predefinedColors ? predefinedColors : {}; + + // We don't want to share aliases across instances so we extend new object + this.colors = $.extend({}, Color.webColors, this.predefinedColors); + + if (val) { + if (typeof val.h !== 'undefined') { + this.value = val; + } else { + this.setColor(String(val)); + } + } + + if (!this.value) { + // Initial value is always black if no arguments are passed or val is empty + this.value = { + h: 0, + s: 0, + b: 0, + a: 1 + }; + } + }; + + Color.webColors = { // 140 predefined colors from the HTML Colors spec + "aliceblue": "f0f8ff", + "antiquewhite": "faebd7", + "aqua": "00ffff", + "aquamarine": "7fffd4", + "azure": "f0ffff", + "beige": "f5f5dc", + "bisque": "ffe4c4", + "black": "000000", + "blanchedalmond": "ffebcd", + "blue": "0000ff", + "blueviolet": "8a2be2", + "brown": "a52a2a", + "burlywood": "deb887", + "cadetblue": "5f9ea0", + "chartreuse": "7fff00", + "chocolate": "d2691e", + "coral": "ff7f50", + "cornflowerblue": "6495ed", + "cornsilk": "fff8dc", + "crimson": "dc143c", + "cyan": "00ffff", + "darkblue": "00008b", + "darkcyan": "008b8b", + "darkgoldenrod": "b8860b", + "darkgray": "a9a9a9", + "darkgreen": "006400", + "darkkhaki": "bdb76b", + "darkmagenta": "8b008b", + "darkolivegreen": "556b2f", + "darkorange": "ff8c00", + "darkorchid": "9932cc", + "darkred": "8b0000", + "darksalmon": "e9967a", + "darkseagreen": "8fbc8f", + "darkslateblue": "483d8b", + "darkslategray": "2f4f4f", + "darkturquoise": "00ced1", + "darkviolet": "9400d3", + "deeppink": "ff1493", + "deepskyblue": "00bfff", + "dimgray": "696969", + "dodgerblue": "1e90ff", + "firebrick": "b22222", + "floralwhite": "fffaf0", + "forestgreen": "228b22", + "fuchsia": "ff00ff", + "gainsboro": "dcdcdc", + "ghostwhite": "f8f8ff", + "gold": "ffd700", + "goldenrod": "daa520", + "gray": "808080", + "green": "008000", + "greenyellow": "adff2f", + "honeydew": "f0fff0", + "hotpink": "ff69b4", + "indianred": "cd5c5c", + "indigo": "4b0082", + "ivory": "fffff0", + "khaki": "f0e68c", + "lavender": "e6e6fa", + "lavenderblush": "fff0f5", + "lawngreen": "7cfc00", + "lemonchiffon": "fffacd", + "lightblue": "add8e6", + "lightcoral": "f08080", + "lightcyan": "e0ffff", + "lightgoldenrodyellow": "fafad2", + "lightgrey": "d3d3d3", + "lightgreen": "90ee90", + "lightpink": "ffb6c1", + "lightsalmon": "ffa07a", + "lightseagreen": "20b2aa", + "lightskyblue": "87cefa", + "lightslategray": "778899", + "lightsteelblue": "b0c4de", + "lightyellow": "ffffe0", + "lime": "00ff00", + "limegreen": "32cd32", + "linen": "faf0e6", + "magenta": "ff00ff", + "maroon": "800000", + "mediumaquamarine": "66cdaa", + "mediumblue": "0000cd", + "mediumorchid": "ba55d3", + "mediumpurple": "9370d8", + "mediumseagreen": "3cb371", + "mediumslateblue": "7b68ee", + "mediumspringgreen": "00fa9a", + "mediumturquoise": "48d1cc", + "mediumvioletred": "c71585", + "midnightblue": "191970", + "mintcream": "f5fffa", + "mistyrose": "ffe4e1", + "moccasin": "ffe4b5", + "navajowhite": "ffdead", + "navy": "000080", + "oldlace": "fdf5e6", + "olive": "808000", + "olivedrab": "6b8e23", + "orange": "ffa500", + "orangered": "ff4500", + "orchid": "da70d6", + "palegoldenrod": "eee8aa", + "palegreen": "98fb98", + "paleturquoise": "afeeee", + "palevioletred": "d87093", + "papayawhip": "ffefd5", + "peachpuff": "ffdab9", + "peru": "cd853f", + "pink": "ffc0cb", + "plum": "dda0dd", + "powderblue": "b0e0e6", + "purple": "800080", + "red": "ff0000", + "rosybrown": "bc8f8f", + "royalblue": "4169e1", + "saddlebrown": "8b4513", + "salmon": "fa8072", + "sandybrown": "f4a460", + "seagreen": "2e8b57", + "seashell": "fff5ee", + "sienna": "a0522d", + "silver": "c0c0c0", + "skyblue": "87ceeb", + "slateblue": "6a5acd", + "slategray": "708090", + "snow": "fffafa", + "springgreen": "00ff7f", + "steelblue": "4682b4", + "tan": "d2b48c", + "teal": "008080", + "thistle": "d8bfd8", + "tomato": "ff6347", + "turquoise": "40e0d0", + "violet": "ee82ee", + "wheat": "f5deb3", + "white": "ffffff", + "whitesmoke": "f5f5f5", + "yellow": "ffff00", + "yellowgreen": "9acd32", + "transparent": "transparent" + }; + + Color.prototype = { + constructor: Color, + colors: {}, // merged web and predefined colors + predefinedColors: {}, + /** + * @return {Object} + */ + getValue: function() { + return this.value; + }, + /** + * @param {Object} val + */ + setValue: function(val) { + this.value = val; + }, + _sanitizeNumber: function(val) { + if (typeof val === 'number') { + return val; + } + if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) { + return 1; + } + if (val === '') { + return 0; + } + if (typeof val.toLowerCase !== 'undefined') { + if (val.match(/^\./)) { + val = "0" + val; + } + return Math.ceil(parseFloat(val) * 100) / 100; + } + return 1; + }, + isTransparent: function(strVal) { + if (!strVal || !(typeof strVal === 'string' || strVal instanceof String)) { + return false; + } + strVal = strVal.toLowerCase().trim(); + return (strVal === 'transparent') || (strVal.match(/#?00000000/)) || (strVal.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/)); + }, + rgbaIsTransparent: function(rgba) { + return ((rgba.r === 0) && (rgba.g === 0) && (rgba.b === 0) && (rgba.a === 0)); + }, + // parse a string to HSB + /** + * @protected + * @param {String} strVal + * @returns {boolean} Returns true if it could be parsed, false otherwise + */ + setColor: function(strVal) { + strVal = strVal.toLowerCase().trim(); + if (strVal) { + if (this.isTransparent(strVal)) { + this.value = { + h: 0, + s: 0, + b: 0, + a: 0 + }; + return true; + } else { + var parsedColor = this.parse(strVal); + if (parsedColor) { + this.value = this.value = { + h: parsedColor.h, + s: parsedColor.s, + b: parsedColor.b, + a: parsedColor.a + }; + if (!this.origFormat) { + this.origFormat = parsedColor.format; + } + } else if (this.fallbackValue) { + // if parser fails, defaults to fallbackValue if defined, otherwise the value won't be changed + this.value = this.fallbackValue; + } + } + } + return false; + }, + setHue: function(h) { + this.value.h = 1 - h; + }, + setSaturation: function(s) { + this.value.s = s; + }, + setBrightness: function(b) { + this.value.b = 1 - b; + }, + setAlpha: function(a) { + this.value.a = Math.round((parseInt((1 - a) * 100, 10) / 100) * 100) / 100; + }, + toRGB: function(h, s, b, a) { + if (arguments.length === 0) { + h = this.value.h; + s = this.value.s; + b = this.value.b; + a = this.value.a; + } + + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = b * s; + X = C * (1 - Math.abs(h % 2 - 1)); + R = G = B = b - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + + return { + r: Math.round(R * 255), + g: Math.round(G * 255), + b: Math.round(B * 255), + a: a + }; + }, + toHex: function(ignoreFormat, h, s, b, a) { + if (arguments.length <= 1) { + h = this.value.h; + s = this.value.s; + b = this.value.b; + a = this.value.a; + } + + var prefix = '#'; + var rgb = this.toRGB(h, s, b, a); + + if (this.rgbaIsTransparent(rgb)) { + return 'transparent'; + } + + if (!ignoreFormat) { + prefix = (this.hexNumberSignPrefix ? '#' : ''); + } + + var hexStr = prefix + ( + (1 << 24) + + (parseInt(rgb.r) << 16) + + (parseInt(rgb.g) << 8) + + parseInt(rgb.b)) + .toString(16) + .slice(1); + + return hexStr; + }, + toHSL: function(h, s, b, a) { + if (arguments.length === 0) { + h = this.value.h; + s = this.value.s; + b = this.value.b; + a = this.value.a; + } + + var H = h, + L = (2 - s) * b, + S = s * b; + if (L > 0 && L <= 1) { + S /= L; + } else { + S /= 2 - L; + } + L /= 2; + if (S > 1) { + S = 1; + } + return { + h: isNaN(H) ? 0 : H, + s: isNaN(S) ? 0 : S, + l: isNaN(L) ? 0 : L, + a: isNaN(a) ? 0 : a + }; + }, + toAlias: function(r, g, b, a) { + var c, rgb = (arguments.length === 0) ? this.toHex(true) : this.toHex(true, r, g, b, a); + + // support predef. colors in non-hex format too, as defined in the alias itself + var original = this.origFormat === 'alias' ? rgb : this.toString(false, this.origFormat); + + for (var alias in this.colors) { + c = this.colors[alias].toLowerCase().trim(); + if ((c === rgb) || (c === original)) { + return alias; + } + } + return false; + }, + RGBtoHSB: function(r, g, b, a) { + r /= 255; + g /= 255; + b /= 255; + + var H, S, V, C; + V = Math.max(r, g, b); + C = V - Math.min(r, g, b); + H = (C === 0 ? null : + V === r ? (g - b) / C : + V === g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C === 0 ? 0 : C / V; + return { + h: this._sanitizeNumber(H), + s: S, + b: V, + a: this._sanitizeNumber(a) + }; + }, + HueToRGB: function(p, q, h) { + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + if ((h * 6) < 1) { + return p + (q - p) * h * 6; + } else if ((h * 2) < 1) { + return q; + } else if ((h * 3) < 2) { + return p + (q - p) * ((2 / 3) - h) * 6; + } else { + return p; + } + }, + HSLtoRGB: function(h, s, l, a) { + if (s < 0) { + s = 0; + } + var q; + if (l <= 0.5) { + q = l * (1 + s); + } else { + q = l + s - (l * s); + } + + var p = 2 * l - q; + + var tr = h + (1 / 3); + var tg = h; + var tb = h - (1 / 3); + + var r = Math.round(this.HueToRGB(p, q, tr) * 255); + var g = Math.round(this.HueToRGB(p, q, tg) * 255); + var b = Math.round(this.HueToRGB(p, q, tb) * 255); + return [r, g, b, this._sanitizeNumber(a)]; + }, + /** + * @param {String} strVal + * @returns {Object} Object containing h,s,b,a,format properties or FALSE if failed to parse + */ + parse: function(strVal) { + if (typeof strVal !== 'string') { + return this.fallbackValue; + } + if (arguments.length === 0) { + return false; + } + + var that = this, + result = false, + isAlias = (typeof this.colors[strVal] !== 'undefined'), + values, format; + + if (isAlias) { + strVal = this.colors[strVal].toLowerCase().trim(); + } + + $.each(this.stringParsers, function(i, parser) { + var match = parser.re.exec(strVal); + values = match && parser.parse.apply(that, [match]); + if (values) { + result = {}; + format = (isAlias ? 'alias' : (parser.format ? parser.format : that.getValidFallbackFormat())); + if (format.match(/hsla?/)) { + result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values)); + } else { + result = that.RGBtoHSB.apply(that, values); + } + if (result instanceof Object) { + result.format = format; + } + return false; // stop iterating + } + return true; + }); + return result; + }, + getValidFallbackFormat: function() { + var formats = [ + 'rgba', 'rgb', 'hex', 'hsla', 'hsl' + ]; + if (this.origFormat && (formats.indexOf(this.origFormat) !== -1)) { + return this.origFormat; + } + if (this.fallbackFormat && (formats.indexOf(this.fallbackFormat) !== -1)) { + return this.fallbackFormat; + } + + return 'rgba'; // By default, return a format that will not lose the alpha info + }, + /** + * + * @param {string} [format] (default: rgba) + * @param {boolean} [translateAlias] Return real color for pre-defined (non-standard) aliases (default: false) + * @param {boolean} [forceRawValue] Forces hashtag prefix when getting hex color (default: false) + * @returns {String} + */ + toString: function(forceRawValue, format, translateAlias) { + format = format || this.origFormat || this.fallbackFormat; + translateAlias = translateAlias || false; + + var c = false; + + switch (format) { + case 'rgb': + { + c = this.toRGB(); + if (this.rgbaIsTransparent(c)) { + return 'transparent'; + } + return 'rgb(' + c.r + ',' + c.g + ',' + c.b + ')'; + } + break; + case 'rgba': + { + c = this.toRGB(); + return 'rgba(' + c.r + ',' + c.g + ',' + c.b + ',' + c.a + ')'; + } + break; + case 'hsl': + { + c = this.toHSL(); + return 'hsl(' + Math.round(c.h * 360) + ',' + Math.round(c.s * 100) + '%,' + Math.round(c.l * 100) + '%)'; + } + break; + case 'hsla': + { + c = this.toHSL(); + return 'hsla(' + Math.round(c.h * 360) + ',' + Math.round(c.s * 100) + '%,' + Math.round(c.l * 100) + '%,' + c.a + ')'; + } + break; + case 'hex': + { + return this.toHex(forceRawValue); + } + break; + case 'alias': + { + c = this.toAlias(); + + if (c === false) { + return this.toString(forceRawValue, this.getValidFallbackFormat()); + } + + if (translateAlias && !(c in Color.webColors) && (c in this.predefinedColors)) { + return this.predefinedColors[c]; + } + + return c; + } + default: + { + return c; + } + break; + } + }, + // a set of RE's that can match strings and generate color tuples. + // from John Resig color plugin + // https://github.com/jquery/jquery-color/ + stringParsers: [{ + re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + 1 + ]; + } + }, { + re: /rgb\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + 1 + ]; + } + }, { + re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + execResult[4] + ]; + } + }, { + re: /rgba\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + execResult[4] + ]; + } + }, { + re: /hsl\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/, + format: 'hsl', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + re: /hsla\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/, + format: 'hsla', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + re: /#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1], 16), + parseInt(execResult[2], 16), + parseInt(execResult[3], 16), + 1 + ]; + } + }, { + re: /#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1] + execResult[1], 16), + parseInt(execResult[2] + execResult[2], 16), + parseInt(execResult[3] + execResult[3], 16), + 1 + ]; + } + }], + colorNameToHex: function(name) { + if (typeof this.colors[name.toLowerCase()] !== 'undefined') { + return this.colors[name.toLowerCase()]; + } + return false; + } + }; + + /* + * Default plugin options + */ + var defaults = { + horizontal: false, // horizontal mode layout ? + inline: false, //forces to show the colorpicker as an inline element + color: false, //forces a color + format: false, //forces a format + input: 'input', // children input selector + container: false, // container selector + component: '.add-on, .input-group-addon', // children component selector + fallbackColor: false, // fallback color value. null = keeps current color. + fallbackFormat: 'hex', // fallback color format + hexNumberSignPrefix: true, // put a '#' (number sign) before hex strings + sliders: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setHue' + }, + alpha: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setAlpha' + } + }, + slidersHorz: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setHue', + callTop: false + }, + alpha: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setAlpha', + callTop: false + } + }, + template: '"); + jQuery("#event_box").append(t), l(t) + }; + $("#external-events div.external-event").each(function() { + l($(this)) + }), $(document).on('click', '#event_add', function () { + var e = $("#event_title").val(); + o(e) + }), $("#event_box").html(""), o("Holiday"), o("Wife Birthday"), o("Meeting"), o("Anniversary"), o("Dinner"), o("Party"), $("#calendar").fullCalendar("destroy"), $("#calendar").fullCalendar({ + header: r, + defaultView: "month", + slotMinutes: 15, + editable: !0, + droppable: !0, + drop: function(e, t) { + var a = $(this).data("eventObject"), + n = $.extend({}, a); + n.start = e, n.allDay = t, n.className = $(this).attr("data-class"), $("#calendar").fullCalendar("renderEvent", n, !0), $("#drop-remove").is(":checked") && $(this).remove() + }, + + /***** events ********/ + events: [{ + title: "All Day Event", + start: new Date('2016-11-01'), + backgroundColor: "#00FFFF" + }, { + title: "Long Event", + start: new Date('2016-11-07'), + end: new Date('2016-11-10'), + backgroundColor: "#F3565D" + }, { + title: "Repeating Event", + start: new Date('2016-11-16'), + allDay: !1, + backgroundColor: "#1bbc9b" + }, { + title: "Repeating Event", + start: new Date(n, a, t +5, 16, 0), + allDay: !1, + backgroundColor: "#1bbc9b" + }, { + title: "Meeting", + start: new Date(n, a, t, 10, 30), + allDay: !1 + }, { + title: "Lunch", + start: new Date(n, a, t, 12, 0), + end: new Date(n, a, t, 14, 0), + backgroundColor: "#F8CB00", + allDay: !1 + }, { + title: "Birthday Party", + start: new Date(n, a, t + 1, 19, 0), + end: new Date(n, a, t + 1, 22, 30), + backgroundColor: "#9b59b6", + allDay: !1 + }, { + title: "Click for Google", + start: new Date(n, a, 29), + end: new Date(n, a, 30), + backgroundColor: "#9b59b6", + url: "http://google.com/" + }] + }) + } + } + } +}(); +jQuery(document).ready(function() { + 'use strict'; + AppCalendar.init() +}); \ No newline at end of file diff --git a/bassets/chart-js/Chart.bundle.js b/bassets/chart-js/Chart.bundle.js new file mode 100644 index 0000000..8316b52 --- /dev/null +++ b/bassets/chart-js/Chart.bundle.js @@ -0,0 +1,1120 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Chart=f()}})(function(){var define,module,exports;return(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;olum2){return(lum1+0.05)/(lum2+0.05);} +return(lum2+0.05)/(lum1+0.05);},level:function(color2){var contrastRatio=this.contrast(color2);if(contrastRatio>=7.1){return'AAA';} +return(contrastRatio>=4.5)?'AA':'';},dark:function(){var rgb=this.values.rgb;var yiq=(rgb[0]*299+rgb[1]*587+rgb[2]*114)/1000;return yiq<128;},light:function(){return!this.dark();},negate:function(){var rgb=[];for(var i=0;i<3;i++){rgb[i]=255-this.values.rgb[i];} +this.setValues('rgb',rgb);return this;},lighten:function(ratio){var hsl=this.values.hsl;hsl[2]+=hsl[2]*ratio;this.setValues('hsl',hsl);return this;},darken:function(ratio){var hsl=this.values.hsl;hsl[2]-=hsl[2]*ratio;this.setValues('hsl',hsl);return this;},saturate:function(ratio){var hsl=this.values.hsl;hsl[1]+=hsl[1]*ratio;this.setValues('hsl',hsl);return this;},desaturate:function(ratio){var hsl=this.values.hsl;hsl[1]-=hsl[1]*ratio;this.setValues('hsl',hsl);return this;},whiten:function(ratio){var hwb=this.values.hwb;hwb[1]+=hwb[1]*ratio;this.setValues('hwb',hwb);return this;},blacken:function(ratio){var hwb=this.values.hwb;hwb[2]+=hwb[2]*ratio;this.setValues('hwb',hwb);return this;},greyscale:function(){var rgb=this.values.rgb;var val=rgb[0]*0.3+rgb[1]*0.59+rgb[2]*0.11;this.setValues('rgb',[val,val,val]);return this;},clearer:function(ratio){var alpha=this.values.alpha;this.setValues('alpha',alpha-(alpha*ratio));return this;},opaquer:function(ratio){var alpha=this.values.alpha;this.setValues('alpha',alpha+(alpha*ratio));return this;},rotate:function(degrees){var hsl=this.values.hsl;var hue=(hsl[0]+degrees)%360;hsl[0]=hue<0?360+hue:hue;this.setValues('hsl',hsl);return this;},mix:function(mixinColor,weight){var color1=this;var color2=mixinColor;var p=weight===undefined?0.5:weight;var w=2*p-1;var a=color1.alpha()-color2.alpha();var w1=(((w*a===-1)?w:(w+a)/(1+w*a))+1)/2.0;var w2=1-w1;return this.rgb(w1*color1.red()+w2*color2.red(),w1*color1.green()+w2*color2.green(),w1*color1.blue()+w2*color2.blue()).alpha(color1.alpha()*p+color2.alpha()*(1-p));},toJSON:function(){return this.rgb();},clone:function(){var result=new Color();var source=this.values;var target=result.values;var value,type;for(var prop in source){if(source.hasOwnProperty(prop)){value=source[prop];type=({}).toString.call(value);if(type==='[object Array]'){target[prop]=value.slice(0);}else if(type==='[object Number]'){target[prop]=value;}else{console.error('unexpected color value:',value);}}} +return result;}};Color.prototype.spaces={rgb:['red','green','blue'],hsl:['hue','saturation','lightness'],hsv:['hue','saturation','value'],hwb:['hue','whiteness','blackness'],cmyk:['cyan','magenta','yellow','black']};Color.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]};Color.prototype.getValues=function(space){var values=this.values;var vals={};for(var i=0;i0.04045?Math.pow(((r+0.055)/1.055),2.4):(r/12.92);g=g>0.04045?Math.pow(((g+0.055)/1.055),2.4):(g/12.92);b=b>0.04045?Math.pow(((b+0.055)/1.055),2.4):(b/12.92);var x=(r*0.4124)+(g*0.3576)+(b*0.1805);var y=(r*0.2126)+(g*0.7152)+(b*0.0722);var z=(r*0.0193)+(g*0.1192)+(b*0.9505);return[x*100,y*100,z*100];} +function rgb2lab(rgb){var xyz=rgb2xyz(rgb),x=xyz[0],y=xyz[1],z=xyz[2],l,a,b;x/=95.047;y/=100;z/=108.883;x=x>0.008856?Math.pow(x,1/3):(7.787*x)+(16/116);y=y>0.008856?Math.pow(y,1/3):(7.787*y)+(16/116);z=z>0.008856?Math.pow(z,1/3):(7.787*z)+(16/116);l=(116*y)-16;a=500*(x-y);b=200*(y-z);return[l,a,b];} +function rgb2lch(args){return lab2lch(rgb2lab(args));} +function hsl2rgb(hsl){var h=hsl[0]/360,s=hsl[1]/100,l=hsl[2]/100,t1,t2,t3,rgb,val;if(s==0){val=l*255;return[val,val,val];} +if(l<0.5) +t2=l*(1+s);else +t2=l+s-l*s;t1=2*l-t2;rgb=[0,0,0];for(var i=0;i<3;i++){t3=h+1/3*-(i-1);t3<0&&t3++;t3>1&&t3--;if(6*t3<1) +val=t1+(t2-t1)*6*t3;else if(2*t3<1) +val=t2;else if(3*t3<2) +val=t1+(t2-t1)*(2/3-t3)*6;else +val=t1;rgb[i]=val*255;} +return rgb;} +function hsl2hsv(hsl){var h=hsl[0],s=hsl[1]/100,l=hsl[2]/100,sv,v;if(l===0){return[0,0,0];} +l*=2;s*=(l<=1)?l:2-l;v=(l+s)/2;sv=(2*s)/(l+s);return[h,sv*100,v*100];} +function hsl2hwb(args){return rgb2hwb(hsl2rgb(args));} +function hsl2cmyk(args){return rgb2cmyk(hsl2rgb(args));} +function hsl2keyword(args){return rgb2keyword(hsl2rgb(args));} +function hsv2rgb(hsv){var h=hsv[0]/60,s=hsv[1]/100,v=hsv[2]/100,hi=Math.floor(h)%6;var f=h-Math.floor(h),p=255*v*(1-s),q=255*v*(1-(s*f)),t=255*v*(1-(s*(1-f))),v=255*v;switch(hi){case 0:return[v,t,p];case 1:return[q,v,p];case 2:return[p,v,t];case 3:return[p,q,v];case 4:return[t,p,v];case 5:return[v,p,q];}} +function hsv2hsl(hsv){var h=hsv[0],s=hsv[1]/100,v=hsv[2]/100,sl,l;l=(2-s)*v;sl=s*v;sl/=(l<=1)?l:2-l;sl=sl||0;l/=2;return[h,sl*100,l*100];} +function hsv2hwb(args){return rgb2hwb(hsv2rgb(args))} +function hsv2cmyk(args){return rgb2cmyk(hsv2rgb(args));} +function hsv2keyword(args){return rgb2keyword(hsv2rgb(args));} +function hwb2rgb(hwb){var h=hwb[0]/360,wh=hwb[1]/100,bl=hwb[2]/100,ratio=wh+bl,i,v,f,n;if(ratio>1){wh/=ratio;bl/=ratio;} +i=Math.floor(6*h);v=1-bl;f=6*h-i;if((i&0x01)!=0){f=1-f;} +n=wh+f*(v-wh);switch(i){default:case 6:case 0:r=v;g=n;b=wh;break;case 1:r=n;g=v;b=wh;break;case 2:r=wh;g=v;b=n;break;case 3:r=wh;g=n;b=v;break;case 4:r=n;g=wh;b=v;break;case 5:r=v;g=wh;b=n;break;} +return[r*255,g*255,b*255];} +function hwb2hsl(args){return rgb2hsl(hwb2rgb(args));} +function hwb2hsv(args){return rgb2hsv(hwb2rgb(args));} +function hwb2cmyk(args){return rgb2cmyk(hwb2rgb(args));} +function hwb2keyword(args){return rgb2keyword(hwb2rgb(args));} +function cmyk2rgb(cmyk){var c=cmyk[0]/100,m=cmyk[1]/100,y=cmyk[2]/100,k=cmyk[3]/100,r,g,b;r=1-Math.min(1,c*(1-k)+k);g=1-Math.min(1,m*(1-k)+k);b=1-Math.min(1,y*(1-k)+k);return[r*255,g*255,b*255];} +function cmyk2hsl(args){return rgb2hsl(cmyk2rgb(args));} +function cmyk2hsv(args){return rgb2hsv(cmyk2rgb(args));} +function cmyk2hwb(args){return rgb2hwb(cmyk2rgb(args));} +function cmyk2keyword(args){return rgb2keyword(cmyk2rgb(args));} +function xyz2rgb(xyz){var x=xyz[0]/100,y=xyz[1]/100,z=xyz[2]/100,r,g,b;r=(x*3.2406)+(y*-1.5372)+(z*-0.4986);g=(x*-0.9689)+(y*1.8758)+(z*0.0415);b=(x*0.0557)+(y*-0.2040)+(z*1.0570);r=r>0.0031308?((1.055*Math.pow(r,1.0/2.4))-0.055):r=(r*12.92);g=g>0.0031308?((1.055*Math.pow(g,1.0/2.4))-0.055):g=(g*12.92);b=b>0.0031308?((1.055*Math.pow(b,1.0/2.4))-0.055):b=(b*12.92);r=Math.min(Math.max(0,r),1);g=Math.min(Math.max(0,g),1);b=Math.min(Math.max(0,b),1);return[r*255,g*255,b*255];} +function xyz2lab(xyz){var x=xyz[0],y=xyz[1],z=xyz[2],l,a,b;x/=95.047;y/=100;z/=108.883;x=x>0.008856?Math.pow(x,1/3):(7.787*x)+(16/116);y=y>0.008856?Math.pow(y,1/3):(7.787*y)+(16/116);z=z>0.008856?Math.pow(z,1/3):(7.787*z)+(16/116);l=(116*y)-16;a=500*(x-y);b=200*(y-z);return[l,a,b];} +function xyz2lch(args){return lab2lch(xyz2lab(args));} +function lab2xyz(lab){var l=lab[0],a=lab[1],b=lab[2],x,y,z,y2;if(l<=8){y=(l*100)/903.3;y2=(7.787*(y/100))+(16/116);}else{y=100*Math.pow((l+16)/116,3);y2=Math.pow(y/100,1/3);} +x=x/95.047<=0.008856?x=(95.047*((a/500)+y2-(16/116)))/7.787:95.047*Math.pow((a/500)+y2,3);z=z/108.883<=0.008859?z=(108.883*(y2-(b/200)-(16/116)))/7.787:108.883*Math.pow(y2-(b/200),3);return[x,y,z];} +function lab2lch(lab){var l=lab[0],a=lab[1],b=lab[2],hr,h,c;hr=Math.atan2(b,a);h=hr*360/2/Math.PI;if(h<0){h+=360;} +c=Math.sqrt(a*a+b*b);return[l,c,h];} +function lab2rgb(args){return xyz2rgb(lab2xyz(args));} +function lch2lab(lch){var l=lch[0],c=lch[1],h=lch[2],a,b,hr;hr=h/360*2*Math.PI;a=c*Math.cos(hr);b=c*Math.sin(hr);return[l,a,b];} +function lch2xyz(args){return lab2xyz(lch2lab(args));} +function lch2rgb(args){return lab2rgb(lch2lab(args));} +function keyword2rgb(keyword){return cssKeywords[keyword];} +function keyword2hsl(args){return rgb2hsl(keyword2rgb(args));} +function keyword2hsv(args){return rgb2hsv(keyword2rgb(args));} +function keyword2hwb(args){return rgb2hwb(keyword2rgb(args));} +function keyword2cmyk(args){return rgb2cmyk(keyword2rgb(args));} +function keyword2lab(args){return rgb2lab(keyword2rgb(args));} +function keyword2xyz(args){return rgb2xyz(keyword2rgb(args));} +var cssKeywords={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};var reverseKeywords={};for(var key in cssKeywords){reverseKeywords[JSON.stringify(cssKeywords[key])]=key;}},{}],4:[function(require,module,exports){var conversions=require(3);var convert=function(){return new Converter();} +for(var func in conversions){convert[func+"Raw"]=(function(func){return function(arg){if(typeof arg=="number") +arg=Array.prototype.slice.call(arguments);return conversions[func](arg);}})(func);var pair=/(\w+)2(\w+)/.exec(func),from=pair[1],to=pair[2];convert[from]=convert[from]||{};convert[from][to]=convert[func]=(function(func){return function(arg){if(typeof arg=="number") +arg=Array.prototype.slice.call(arguments);var val=conversions[func](arg);if(typeof val=="string"||val===undefined) +return val;for(var i=0;i>>0;for(var i=0;i0){for(i=0;i0?'future':'past'];return isFunction(format)?format(output):format.replace(/%s/i,output);} +var aliases={};function addUnitAlias(unit,shorthand){var lowerCase=unit.toLowerCase();aliases[lowerCase]=aliases[lowerCase+'s']=aliases[shorthand]=unit;} +function normalizeUnits(units){return typeof units==='string'?aliases[units]||aliases[units.toLowerCase()]:undefined;} +function normalizeObjectUnits(inputObject){var normalizedInput={},normalizedProp,prop;for(prop in inputObject){if(hasOwnProp(inputObject,prop)){normalizedProp=normalizeUnits(prop);if(normalizedProp){normalizedInput[normalizedProp]=inputObject[prop];}}} +return normalizedInput;} +var priorities={};function addUnitPriority(unit,priority){priorities[unit]=priority;} +function getPrioritizedUnits(unitsObj){var units=[];for(var u in unitsObj){units.push({unit:u,priority:priorities[u]});} +units.sort(function(a,b){return a.priority-b.priority;});return units;} +function makeGetSet(unit,keepTime){return function(value){if(value!=null){set$1(this,unit,value);hooks.updateOffset(this,keepTime);return this;}else{return get(this,unit);}};} +function get(mom,unit){return mom.isValid()?mom._d['get'+(mom._isUTC?'UTC':'')+unit]():NaN;} +function set$1(mom,unit,value){if(mom.isValid()){mom._d['set'+(mom._isUTC?'UTC':'')+unit](value);}} +function stringGet(units){units=normalizeUnits(units);if(isFunction(this[units])){return this[units]();} +return this;} +function stringSet(units,value){if(typeof units==='object'){units=normalizeObjectUnits(units);var prioritized=getPrioritizedUnits(units);for(var i=0;i=0;return(sign?(forceSign?'+':''):'-')+Math.pow(10,Math.max(0,zerosToFill)).toString().substr(1)+absNumber;} +var formattingTokens=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;var localFormattingTokens=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;var formatFunctions={};var formatTokenFunctions={};function addFormatToken(token,padded,ordinal,callback){var func=callback;if(typeof callback==='string'){func=function(){return this[callback]();};} +if(token){formatTokenFunctions[token]=func;} +if(padded){formatTokenFunctions[padded[0]]=function(){return zeroFill(func.apply(this,arguments),padded[1],padded[2]);};} +if(ordinal){formatTokenFunctions[ordinal]=function(){return this.localeData().ordinal(func.apply(this,arguments),token);};}} +function removeFormattingTokens(input){if(input.match(/\[[\s\S]/)){return input.replace(/^\[|\]$/g,'');} +return input.replace(/\\/g,'');} +function makeFormatFunction(format){var array=format.match(formattingTokens),i,length;for(i=0,length=array.length;i=0&&localFormattingTokens.test(format)){format=format.replace(localFormattingTokens,replaceLongDateFormatTokens);localFormattingTokens.lastIndex=0;i-=1;} +return format;} +var match1=/\d/;var match2=/\d\d/;var match3=/\d{3}/;var match4=/\d{4}/;var match6=/[+-]?\d{6}/;var match1to2=/\d\d?/;var match3to4=/\d\d\d\d?/;var match5to6=/\d\d\d\d\d\d?/;var match1to3=/\d{1,3}/;var match1to4=/\d{1,4}/;var match1to6=/[+-]?\d{1,6}/;var matchUnsigned=/\d+/;var matchSigned=/[+-]?\d+/;var matchOffset=/Z|[+-]\d\d:?\d\d/gi;var matchShortOffset=/Z|[+-]\d\d(?::?\d\d)?/gi;var matchTimestamp=/[+-]?\d+(\.\d{1,3})?/;var matchWord=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i;var regexes={};function addRegexToken(token,regex,strictRegex){regexes[token]=isFunction(regex)?regex:function(isStrict,localeData){return(isStrict&&strictRegex)?strictRegex:regex;};} +function getParseRegexForToken(token,config){if(!hasOwnProp(regexes,token)){return new RegExp(unescapeFormat(token));} +return regexes[token](config._strict,config._locale);} +function unescapeFormat(s){return regexEscape(s.replace('\\','').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(matched,p1,p2,p3,p4){return p1||p2||p3||p4;}));} +function regexEscape(s){return s.replace(/[-\/\\^$*+?.()|[\]{}]/g,'\\$&');} +var tokens={};function addParseToken(token,callback){var i,func=callback;if(typeof token==='string'){token=[token];} +if(isNumber(callback)){func=function(input,array){array[callback]=toInt(input);};} +for(i=0;i68?1900:2000);};var getSetYear=makeGetSet('FullYear',true);function getIsLeapYear(){return isLeapYear(this.year());} +function createDate(y,m,d,h,M,s,ms){var date=new Date(y,m,d,h,M,s,ms);if(y<100&&y>=0&&isFinite(date.getFullYear())){date.setFullYear(y);} +return date;} +function createUTCDate(y){var date=new Date(Date.UTC.apply(null,arguments));if(y<100&&y>=0&&isFinite(date.getUTCFullYear())){date.setUTCFullYear(y);} +return date;} +function firstWeekOffset(year,dow,doy){var +fwd=7+dow-doy,fwdlw=(7+createUTCDate(year,0,fwd).getUTCDay()-dow)%7;return-fwdlw+fwd-1;} +function dayOfYearFromWeeks(year,week,weekday,dow,doy){var localWeekday=(7+weekday-dow)%7,weekOffset=firstWeekOffset(year,dow,doy),dayOfYear=1+7*(week-1)+localWeekday+weekOffset,resYear,resDayOfYear;if(dayOfYear<=0){resYear=year-1;resDayOfYear=daysInYear(resYear)+dayOfYear;}else if(dayOfYear>daysInYear(year)){resYear=year+1;resDayOfYear=dayOfYear-daysInYear(year);}else{resYear=year;resDayOfYear=dayOfYear;} +return{year:resYear,dayOfYear:resDayOfYear};} +function weekOfYear(mom,dow,doy){var weekOffset=firstWeekOffset(mom.year(),dow,doy),week=Math.floor((mom.dayOfYear()-weekOffset-1)/7)+1,resWeek,resYear;if(week<1){resYear=mom.year()-1;resWeek=week+weeksInYear(resYear,dow,doy);}else if(week>weeksInYear(mom.year(),dow,doy)){resWeek=week-weeksInYear(mom.year(),dow,doy);resYear=mom.year()+1;}else{resYear=mom.year();resWeek=week;} +return{week:resWeek,year:resYear};} +function weeksInYear(year,dow,doy){var weekOffset=firstWeekOffset(year,dow,doy),weekOffsetNext=firstWeekOffset(year+1,dow,doy);return(daysInYear(year)-weekOffset+weekOffsetNext)/7;} +addFormatToken('w',['ww',2],'wo','week');addFormatToken('W',['WW',2],'Wo','isoWeek');addUnitAlias('week','w');addUnitAlias('isoWeek','W');addUnitPriority('week',5);addUnitPriority('isoWeek',5);addRegexToken('w',match1to2);addRegexToken('ww',match1to2,match2);addRegexToken('W',match1to2);addRegexToken('WW',match1to2,match2);addWeekParseToken(['w','ww','W','WW'],function(input,week,config,token){week[token.substr(0,1)]=toInt(input);});function localeWeek(mom){return weekOfYear(mom,this._week.dow,this._week.doy).week;} +var defaultLocaleWeek={dow:0,doy:6};function localeFirstDayOfWeek(){return this._week.dow;} +function localeFirstDayOfYear(){return this._week.doy;} +function getSetWeek(input){var week=this.localeData().week(this);return input==null?week:this.add((input-week)*7,'d');} +function getSetISOWeek(input){var week=weekOfYear(this,1,4).week;return input==null?week:this.add((input-week)*7,'d');} +addFormatToken('d',0,'do','day');addFormatToken('dd',0,0,function(format){return this.localeData().weekdaysMin(this,format);});addFormatToken('ddd',0,0,function(format){return this.localeData().weekdaysShort(this,format);});addFormatToken('dddd',0,0,function(format){return this.localeData().weekdays(this,format);});addFormatToken('e',0,0,'weekday');addFormatToken('E',0,0,'isoWeekday');addUnitAlias('day','d');addUnitAlias('weekday','e');addUnitAlias('isoWeekday','E');addUnitPriority('day',11);addUnitPriority('weekday',11);addUnitPriority('isoWeekday',11);addRegexToken('d',match1to2);addRegexToken('e',match1to2);addRegexToken('E',match1to2);addRegexToken('dd',function(isStrict,locale){return locale.weekdaysMinRegex(isStrict);});addRegexToken('ddd',function(isStrict,locale){return locale.weekdaysShortRegex(isStrict);});addRegexToken('dddd',function(isStrict,locale){return locale.weekdaysRegex(isStrict);});addWeekParseToken(['dd','ddd','dddd'],function(input,week,config,token){var weekday=config._locale.weekdaysParse(input,token,config._strict);if(weekday!=null){week.d=weekday;}else{getParsingFlags(config).invalidWeekday=input;}});addWeekParseToken(['d','e','E'],function(input,week,config,token){week[token]=toInt(input);});function parseWeekday(input,locale){if(typeof input!=='string'){return input;} +if(!isNaN(input)){return parseInt(input,10);} +input=locale.weekdaysParse(input);if(typeof input==='number'){return input;} +return null;} +function parseIsoWeekday(input,locale){if(typeof input==='string'){return locale.weekdaysParse(input)%7||7;} +return isNaN(input)?null:input;} +var defaultLocaleWeekdays='Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');function localeWeekdays(m,format){if(!m){return isArray(this._weekdays)?this._weekdays:this._weekdays['standalone'];} +return isArray(this._weekdays)?this._weekdays[m.day()]:this._weekdays[this._weekdays.isFormat.test(format)?'format':'standalone'][m.day()];} +var defaultLocaleWeekdaysShort='Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');function localeWeekdaysShort(m){return(m)?this._weekdaysShort[m.day()]:this._weekdaysShort;} +var defaultLocaleWeekdaysMin='Su_Mo_Tu_We_Th_Fr_Sa'.split('_');function localeWeekdaysMin(m){return(m)?this._weekdaysMin[m.day()]:this._weekdaysMin;} +function handleStrictParse$1(weekdayName,format,strict){var i,ii,mom,llc=weekdayName.toLocaleLowerCase();if(!this._weekdaysParse){this._weekdaysParse=[];this._shortWeekdaysParse=[];this._minWeekdaysParse=[];for(i=0;i<7;++i){mom=createUTC([2000,1]).day(i);this._minWeekdaysParse[i]=this.weekdaysMin(mom,'').toLocaleLowerCase();this._shortWeekdaysParse[i]=this.weekdaysShort(mom,'').toLocaleLowerCase();this._weekdaysParse[i]=this.weekdays(mom,'').toLocaleLowerCase();}} +if(strict){if(format==='dddd'){ii=indexOf$1.call(this._weekdaysParse,llc);return ii!==-1?ii:null;}else if(format==='ddd'){ii=indexOf$1.call(this._shortWeekdaysParse,llc);return ii!==-1?ii:null;}else{ii=indexOf$1.call(this._minWeekdaysParse,llc);return ii!==-1?ii:null;}}else{if(format==='dddd'){ii=indexOf$1.call(this._weekdaysParse,llc);if(ii!==-1){return ii;} +ii=indexOf$1.call(this._shortWeekdaysParse,llc);if(ii!==-1){return ii;} +ii=indexOf$1.call(this._minWeekdaysParse,llc);return ii!==-1?ii:null;}else if(format==='ddd'){ii=indexOf$1.call(this._shortWeekdaysParse,llc);if(ii!==-1){return ii;} +ii=indexOf$1.call(this._weekdaysParse,llc);if(ii!==-1){return ii;} +ii=indexOf$1.call(this._minWeekdaysParse,llc);return ii!==-1?ii:null;}else{ii=indexOf$1.call(this._minWeekdaysParse,llc);if(ii!==-1){return ii;} +ii=indexOf$1.call(this._weekdaysParse,llc);if(ii!==-1){return ii;} +ii=indexOf$1.call(this._shortWeekdaysParse,llc);return ii!==-1?ii:null;}}} +function localeWeekdaysParse(weekdayName,format,strict){var i,mom,regex;if(this._weekdaysParseExact){return handleStrictParse$1.call(this,weekdayName,format,strict);} +if(!this._weekdaysParse){this._weekdaysParse=[];this._minWeekdaysParse=[];this._shortWeekdaysParse=[];this._fullWeekdaysParse=[];} +for(i=0;i<7;i++){mom=createUTC([2000,1]).day(i);if(strict&&!this._fullWeekdaysParse[i]){this._fullWeekdaysParse[i]=new RegExp('^'+this.weekdays(mom,'').replace('.','\.?')+'$','i');this._shortWeekdaysParse[i]=new RegExp('^'+this.weekdaysShort(mom,'').replace('.','\.?')+'$','i');this._minWeekdaysParse[i]=new RegExp('^'+this.weekdaysMin(mom,'').replace('.','\.?')+'$','i');} +if(!this._weekdaysParse[i]){regex='^'+this.weekdays(mom,'')+'|^'+this.weekdaysShort(mom,'')+'|^'+this.weekdaysMin(mom,'');this._weekdaysParse[i]=new RegExp(regex.replace('.',''),'i');} +if(strict&&format==='dddd'&&this._fullWeekdaysParse[i].test(weekdayName)){return i;}else if(strict&&format==='ddd'&&this._shortWeekdaysParse[i].test(weekdayName)){return i;}else if(strict&&format==='dd'&&this._minWeekdaysParse[i].test(weekdayName)){return i;}else if(!strict&&this._weekdaysParse[i].test(weekdayName)){return i;}}} +function getSetDayOfWeek(input){if(!this.isValid()){return input!=null?this:NaN;} +var day=this._isUTC?this._d.getUTCDay():this._d.getDay();if(input!=null){input=parseWeekday(input,this.localeData());return this.add(input-day,'d');}else{return day;}} +function getSetLocaleDayOfWeek(input){if(!this.isValid()){return input!=null?this:NaN;} +var weekday=(this.day()+7-this.localeData()._week.dow)%7;return input==null?weekday:this.add(input-weekday,'d');} +function getSetISODayOfWeek(input){if(!this.isValid()){return input!=null?this:NaN;} +if(input!=null){var weekday=parseIsoWeekday(input,this.localeData());return this.day(this.day()%7?weekday:weekday-7);}else{return this.day()||7;}} +var defaultWeekdaysRegex=matchWord;function weekdaysRegex(isStrict){if(this._weekdaysParseExact){if(!hasOwnProp(this,'_weekdaysRegex')){computeWeekdaysParse.call(this);} +if(isStrict){return this._weekdaysStrictRegex;}else{return this._weekdaysRegex;}}else{if(!hasOwnProp(this,'_weekdaysRegex')){this._weekdaysRegex=defaultWeekdaysRegex;} +return this._weekdaysStrictRegex&&isStrict?this._weekdaysStrictRegex:this._weekdaysRegex;}} +var defaultWeekdaysShortRegex=matchWord;function weekdaysShortRegex(isStrict){if(this._weekdaysParseExact){if(!hasOwnProp(this,'_weekdaysRegex')){computeWeekdaysParse.call(this);} +if(isStrict){return this._weekdaysShortStrictRegex;}else{return this._weekdaysShortRegex;}}else{if(!hasOwnProp(this,'_weekdaysShortRegex')){this._weekdaysShortRegex=defaultWeekdaysShortRegex;} +return this._weekdaysShortStrictRegex&&isStrict?this._weekdaysShortStrictRegex:this._weekdaysShortRegex;}} +var defaultWeekdaysMinRegex=matchWord;function weekdaysMinRegex(isStrict){if(this._weekdaysParseExact){if(!hasOwnProp(this,'_weekdaysRegex')){computeWeekdaysParse.call(this);} +if(isStrict){return this._weekdaysMinStrictRegex;}else{return this._weekdaysMinRegex;}}else{if(!hasOwnProp(this,'_weekdaysMinRegex')){this._weekdaysMinRegex=defaultWeekdaysMinRegex;} +return this._weekdaysMinStrictRegex&&isStrict?this._weekdaysMinStrictRegex:this._weekdaysMinRegex;}} +function computeWeekdaysParse(){function cmpLenRev(a,b){return b.length-a.length;} +var minPieces=[],shortPieces=[],longPieces=[],mixedPieces=[],i,mom,minp,shortp,longp;for(i=0;i<7;i++){mom=createUTC([2000,1]).day(i);minp=this.weekdaysMin(mom,'');shortp=this.weekdaysShort(mom,'');longp=this.weekdays(mom,'');minPieces.push(minp);shortPieces.push(shortp);longPieces.push(longp);mixedPieces.push(minp);mixedPieces.push(shortp);mixedPieces.push(longp);} +minPieces.sort(cmpLenRev);shortPieces.sort(cmpLenRev);longPieces.sort(cmpLenRev);mixedPieces.sort(cmpLenRev);for(i=0;i<7;i++){shortPieces[i]=regexEscape(shortPieces[i]);longPieces[i]=regexEscape(longPieces[i]);mixedPieces[i]=regexEscape(mixedPieces[i]);} +this._weekdaysRegex=new RegExp('^('+mixedPieces.join('|')+')','i');this._weekdaysShortRegex=this._weekdaysRegex;this._weekdaysMinRegex=this._weekdaysRegex;this._weekdaysStrictRegex=new RegExp('^('+longPieces.join('|')+')','i');this._weekdaysShortStrictRegex=new RegExp('^('+shortPieces.join('|')+')','i');this._weekdaysMinStrictRegex=new RegExp('^('+minPieces.join('|')+')','i');} +function hFormat(){return this.hours()%12||12;} +function kFormat(){return this.hours()||24;} +addFormatToken('H',['HH',2],0,'hour');addFormatToken('h',['hh',2],0,hFormat);addFormatToken('k',['kk',2],0,kFormat);addFormatToken('hmm',0,0,function(){return''+hFormat.apply(this)+zeroFill(this.minutes(),2);});addFormatToken('hmmss',0,0,function(){return''+hFormat.apply(this)+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2);});addFormatToken('Hmm',0,0,function(){return''+this.hours()+zeroFill(this.minutes(),2);});addFormatToken('Hmmss',0,0,function(){return''+this.hours()+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2);});function meridiem(token,lowercase){addFormatToken(token,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),lowercase);});} +meridiem('a',true);meridiem('A',false);addUnitAlias('hour','h');addUnitPriority('hour',13);function matchMeridiem(isStrict,locale){return locale._meridiemParse;} +addRegexToken('a',matchMeridiem);addRegexToken('A',matchMeridiem);addRegexToken('H',match1to2);addRegexToken('h',match1to2);addRegexToken('k',match1to2);addRegexToken('HH',match1to2,match2);addRegexToken('hh',match1to2,match2);addRegexToken('kk',match1to2,match2);addRegexToken('hmm',match3to4);addRegexToken('hmmss',match5to6);addRegexToken('Hmm',match3to4);addRegexToken('Hmmss',match5to6);addParseToken(['H','HH'],HOUR);addParseToken(['k','kk'],function(input,array,config){var kInput=toInt(input);array[HOUR]=kInput===24?0:kInput;});addParseToken(['a','A'],function(input,array,config){config._isPm=config._locale.isPM(input);config._meridiem=input;});addParseToken(['h','hh'],function(input,array,config){array[HOUR]=toInt(input);getParsingFlags(config).bigHour=true;});addParseToken('hmm',function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos));array[MINUTE]=toInt(input.substr(pos));getParsingFlags(config).bigHour=true;});addParseToken('hmmss',function(input,array,config){var pos1=input.length-4;var pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1));array[MINUTE]=toInt(input.substr(pos1,2));array[SECOND]=toInt(input.substr(pos2));getParsingFlags(config).bigHour=true;});addParseToken('Hmm',function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos));array[MINUTE]=toInt(input.substr(pos));});addParseToken('Hmmss',function(input,array,config){var pos1=input.length-4;var pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1));array[MINUTE]=toInt(input.substr(pos1,2));array[SECOND]=toInt(input.substr(pos2));});function localeIsPM(input){return((input+'').toLowerCase().charAt(0)==='p');} +var defaultLocaleMeridiemParse=/[ap]\.?m?\.?/i;function localeMeridiem(hours,minutes,isLower){if(hours>11){return isLower?'pm':'PM';}else{return isLower?'am':'AM';}} +var getSetHour=makeGetSet('Hours',true);var baseConfig={calendar:defaultCalendar,longDateFormat:defaultLongDateFormat,invalidDate:defaultInvalidDate,ordinal:defaultOrdinal,dayOfMonthOrdinalParse:defaultDayOfMonthOrdinalParse,relativeTime:defaultRelativeTime,months:defaultLocaleMonths,monthsShort:defaultLocaleMonthsShort,week:defaultLocaleWeek,weekdays:defaultLocaleWeekdays,weekdaysMin:defaultLocaleWeekdaysMin,weekdaysShort:defaultLocaleWeekdaysShort,meridiemParse:defaultLocaleMeridiemParse};var locales={};var localeFamilies={};var globalLocale;function normalizeLocale(key){return key?key.toLowerCase().replace('_','-'):key;} +function chooseLocale(names){var i=0,j,next,locale,split;while(i0){locale=loadLocale(split.slice(0,j).join('-'));if(locale){return locale;} +if(next&&next.length>=j&&compareArrays(split,next,true)>=j-1){break;} +j--;} +i++;} +return null;} +function loadLocale(name){var oldLocale=null;if(!locales[name]&&(typeof module!=='undefined')&&module&&module.exports){try{oldLocale=globalLocale._abbr;require('./locale/'+name);getSetGlobalLocale(oldLocale);}catch(e){}} +return locales[name];} +function getSetGlobalLocale(key,values){var data;if(key){if(isUndefined(values)){data=getLocale(key);} +else{data=defineLocale(key,values);} +if(data){globalLocale=data;}} +return globalLocale._abbr;} +function defineLocale(name,config){if(config!==null){var parentConfig=baseConfig;config.abbr=name;if(locales[name]!=null){deprecateSimple('defineLocaleOverride','use moment.updateLocale(localeName, config) to change '+'an existing locale. moment.defineLocale(localeName, '+'config) should only be used for creating a new locale '+'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');parentConfig=locales[name]._config;}else if(config.parentLocale!=null){if(locales[config.parentLocale]!=null){parentConfig=locales[config.parentLocale]._config;}else{if(!localeFamilies[config.parentLocale]){localeFamilies[config.parentLocale]=[];} +localeFamilies[config.parentLocale].push({name:name,config:config});return null;}} +locales[name]=new Locale(mergeConfigs(parentConfig,config));if(localeFamilies[name]){localeFamilies[name].forEach(function(x){defineLocale(x.name,x.config);});} +getSetGlobalLocale(name);return locales[name];}else{delete locales[name];return null;}} +function updateLocale(name,config){if(config!=null){var locale,parentConfig=baseConfig;if(locales[name]!=null){parentConfig=locales[name]._config;} +config=mergeConfigs(parentConfig,config);locale=new Locale(config);locale.parentLocale=locales[name];locales[name]=locale;getSetGlobalLocale(name);}else{if(locales[name]!=null){if(locales[name].parentLocale!=null){locales[name]=locales[name].parentLocale;}else if(locales[name]!=null){delete locales[name];}}} +return locales[name];} +function getLocale(key){var locale;if(key&&key._locale&&key._locale._abbr){key=key._locale._abbr;} +if(!key){return globalLocale;} +if(!isArray(key)){locale=loadLocale(key);if(locale){return locale;} +key=[key];} +return chooseLocale(key);} +function listLocales(){return keys$1(locales);} +function checkOverflow(m){var overflow;var a=m._a;if(a&&getParsingFlags(m).overflow===-2){overflow=a[MONTH]<0||a[MONTH]>11?MONTH:a[DATE]<1||a[DATE]>daysInMonth(a[YEAR],a[MONTH])?DATE:a[HOUR]<0||a[HOUR]>24||(a[HOUR]===24&&(a[MINUTE]!==0||a[SECOND]!==0||a[MILLISECOND]!==0))?HOUR:a[MINUTE]<0||a[MINUTE]>59?MINUTE:a[SECOND]<0||a[SECOND]>59?SECOND:a[MILLISECOND]<0||a[MILLISECOND]>999?MILLISECOND:-1;if(getParsingFlags(m)._overflowDayOfYear&&(overflowDATE)){overflow=DATE;} +if(getParsingFlags(m)._overflowWeeks&&overflow===-1){overflow=WEEK;} +if(getParsingFlags(m)._overflowWeekday&&overflow===-1){overflow=WEEKDAY;} +getParsingFlags(m).overflow=overflow;} +return m;} +var extendedIsoRegex=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;var basicIsoRegex=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;var tzRegex=/Z|[+-]\d\d(?::?\d\d)?/;var isoDates=[['YYYYYY-MM-DD',/[+-]\d{6}-\d\d-\d\d/],['YYYY-MM-DD',/\d{4}-\d\d-\d\d/],['GGGG-[W]WW-E',/\d{4}-W\d\d-\d/],['GGGG-[W]WW',/\d{4}-W\d\d/,false],['YYYY-DDD',/\d{4}-\d{3}/],['YYYY-MM',/\d{4}-\d\d/,false],['YYYYYYMMDD',/[+-]\d{10}/],['YYYYMMDD',/\d{8}/],['GGGG[W]WWE',/\d{4}W\d{3}/],['GGGG[W]WW',/\d{4}W\d{2}/,false],['YYYYDDD',/\d{7}/]];var isoTimes=[['HH:mm:ss.SSSS',/\d\d:\d\d:\d\d\.\d+/],['HH:mm:ss,SSSS',/\d\d:\d\d:\d\d,\d+/],['HH:mm:ss',/\d\d:\d\d:\d\d/],['HH:mm',/\d\d:\d\d/],['HHmmss.SSSS',/\d\d\d\d\d\d\.\d+/],['HHmmss,SSSS',/\d\d\d\d\d\d,\d+/],['HHmmss',/\d\d\d\d\d\d/],['HHmm',/\d\d\d\d/],['HH',/\d\d/]];var aspNetJsonRegex=/^\/?Date\((\-?\d+)/i;function configFromISO(config){var i,l,string=config._i,match=extendedIsoRegex.exec(string)||basicIsoRegex.exec(string),allowTime,dateFormat,timeFormat,tzFormat;if(match){getParsingFlags(config).iso=true;for(i=0,l=isoDates.length;i10)?'YYYY ':'YY ');timeFormat='HH:mm'+(match[4]?':ss':'');if(match[1]){var momentDate=new Date(match[2]);var momentDay=['Sun','Mon','Tue','Wed','Thu','Fri','Sat'][momentDate.getDay()];if(match[1].substr(0,3)!==momentDay){getParsingFlags(config).weekdayMismatch=true;config._isValid=false;return;}} +switch(match[5].length){case 2:if(timezoneIndex===0){timezone=' +0000';}else{timezoneIndex=military.indexOf(match[5][1].toUpperCase())-12;timezone=((timezoneIndex<0)?' -':' +')+((''+timezoneIndex).replace(/^-?/,'0')).match(/..$/)[0]+'00';} +break;case 4:timezone=timezones[match[5]];break;default:timezone=timezones[' GMT'];} +match[5]=timezone;config._i=match.splice(1).join('');tzFormat=' ZZ';config._f=dayFormat+dateFormat+timeFormat+tzFormat;configFromStringAndFormat(config);getParsingFlags(config).rfc2822=true;}else{config._isValid=false;}} +function configFromString(config){var matched=aspNetJsonRegex.exec(config._i);if(matched!==null){config._d=new Date(+matched[1]);return;} +configFromISO(config);if(config._isValid===false){delete config._isValid;}else{return;} +configFromRFC2822(config);if(config._isValid===false){delete config._isValid;}else{return;} +hooks.createFromInputFallback(config);} +hooks.createFromInputFallback=deprecate('value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), '+'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are '+'discouraged and will be removed in an upcoming major release. Please refer to '+'http://momentjs.com/guides/#/warnings/js-date/ for more info.',function(config){config._d=new Date(config._i+(config._useUTC?' UTC':''));});function defaults(a,b,c){if(a!=null){return a;} +if(b!=null){return b;} +return c;} +function currentDateArray(config){var nowValue=new Date(hooks.now());if(config._useUTC){return[nowValue.getUTCFullYear(),nowValue.getUTCMonth(),nowValue.getUTCDate()];} +return[nowValue.getFullYear(),nowValue.getMonth(),nowValue.getDate()];} +function configFromArray(config){var i,date,input=[],currentDate,yearToUse;if(config._d){return;} +currentDate=currentDateArray(config);if(config._w&&config._a[DATE]==null&&config._a[MONTH]==null){dayOfYearFromWeekInfo(config);} +if(config._dayOfYear!=null){yearToUse=defaults(config._a[YEAR],currentDate[YEAR]);if(config._dayOfYear>daysInYear(yearToUse)||config._dayOfYear===0){getParsingFlags(config)._overflowDayOfYear=true;} +date=createUTCDate(yearToUse,0,config._dayOfYear);config._a[MONTH]=date.getUTCMonth();config._a[DATE]=date.getUTCDate();} +for(i=0;i<3&&config._a[i]==null;++i){config._a[i]=input[i]=currentDate[i];} +for(;i<7;i++){config._a[i]=input[i]=(config._a[i]==null)?(i===2?1:0):config._a[i];} +if(config._a[HOUR]===24&&config._a[MINUTE]===0&&config._a[SECOND]===0&&config._a[MILLISECOND]===0){config._nextDay=true;config._a[HOUR]=0;} +config._d=(config._useUTC?createUTCDate:createDate).apply(null,input);if(config._tzm!=null){config._d.setUTCMinutes(config._d.getUTCMinutes()-config._tzm);} +if(config._nextDay){config._a[HOUR]=24;}} +function dayOfYearFromWeekInfo(config){var w,weekYear,week,weekday,dow,doy,temp,weekdayOverflow;w=config._w;if(w.GG!=null||w.W!=null||w.E!=null){dow=1;doy=4;weekYear=defaults(w.GG,config._a[YEAR],weekOfYear(createLocal(),1,4).year);week=defaults(w.W,1);weekday=defaults(w.E,1);if(weekday<1||weekday>7){weekdayOverflow=true;}}else{dow=config._locale._week.dow;doy=config._locale._week.doy;var curWeek=weekOfYear(createLocal(),dow,doy);weekYear=defaults(w.gg,config._a[YEAR],curWeek.year);week=defaults(w.w,curWeek.week);if(w.d!=null){weekday=w.d;if(weekday<0||weekday>6){weekdayOverflow=true;}}else if(w.e!=null){weekday=w.e+dow;if(w.e<0||w.e>6){weekdayOverflow=true;}}else{weekday=dow;}} +if(week<1||week>weeksInYear(weekYear,dow,doy)){getParsingFlags(config)._overflowWeeks=true;}else if(weekdayOverflow!=null){getParsingFlags(config)._overflowWeekday=true;}else{temp=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy);config._a[YEAR]=temp.year;config._dayOfYear=temp.dayOfYear;}} +hooks.ISO_8601=function(){};hooks.RFC_2822=function(){};function configFromStringAndFormat(config){if(config._f===hooks.ISO_8601){configFromISO(config);return;} +if(config._f===hooks.RFC_2822){configFromRFC2822(config);return;} +config._a=[];getParsingFlags(config).empty=true;var string=''+config._i,i,parsedInput,tokens,token,skipped,stringLength=string.length,totalParsedInputLength=0;tokens=expandFormat(config._f,config._locale).match(formattingTokens)||[];for(i=0;i0){getParsingFlags(config).unusedInput.push(skipped);} +string=string.slice(string.indexOf(parsedInput)+parsedInput.length);totalParsedInputLength+=parsedInput.length;} +if(formatTokenFunctions[token]){if(parsedInput){getParsingFlags(config).empty=false;} +else{getParsingFlags(config).unusedTokens.push(token);} +addTimeToArrayFromToken(token,parsedInput,config);} +else if(config._strict&&!parsedInput){getParsingFlags(config).unusedTokens.push(token);}} +getParsingFlags(config).charsLeftOver=stringLength-totalParsedInputLength;if(string.length>0){getParsingFlags(config).unusedInput.push(string);} +if(config._a[HOUR]<=12&&getParsingFlags(config).bigHour===true&&config._a[HOUR]>0){getParsingFlags(config).bigHour=undefined;} +getParsingFlags(config).parsedDateParts=config._a.slice(0);getParsingFlags(config).meridiem=config._meridiem;config._a[HOUR]=meridiemFixWrap(config._locale,config._a[HOUR],config._meridiem);configFromArray(config);checkOverflow(config);} +function meridiemFixWrap(locale,hour,meridiem){var isPm;if(meridiem==null){return hour;} +if(locale.meridiemHour!=null){return locale.meridiemHour(hour,meridiem);}else if(locale.isPM!=null){isPm=locale.isPM(meridiem);if(isPm&&hour<12){hour+=12;} +if(!isPm&&hour===12){hour=0;} +return hour;}else{return hour;}} +function configFromStringAndArray(config){var tempConfig,bestMoment,scoreToBeat,i,currentScore;if(config._f.length===0){getParsingFlags(config).invalidFormat=true;config._d=new Date(NaN);return;} +for(i=0;ithis?this:other;}else{return createInvalid();}});function pickBy(fn,moments){var res,i;if(moments.length===1&&isArray(moments[0])){moments=moments[0];} +if(!moments.length){return createLocal();} +res=moments[0];for(i=1;ithis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset());} +function isDaylightSavingTimeShifted(){if(!isUndefined(this._isDSTShifted)){return this._isDSTShifted;} +var c={};copyConfig(c,this);c=prepareConfig(c);if(c._a){var other=c._isUTC?createUTC(c._a):createLocal(c._a);this._isDSTShifted=this.isValid()&&compareArrays(c._a,other.toArray())>0;}else{this._isDSTShifted=false;} +return this._isDSTShifted;} +function isLocal(){return this.isValid()?!this._isUTC:false;} +function isUtcOffset(){return this.isValid()?this._isUTC:false;} +function isUtc(){return this.isValid()?this._isUTC&&this._offset===0:false;} +var aspNetRegex=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;var isoRegex=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;function createDuration(input,key){var duration=input,match=null,sign,ret,diffRes;if(isDuration(input)){duration={ms:input._milliseconds,d:input._days,M:input._months};}else if(isNumber(input)){duration={};if(key){duration[key]=input;}else{duration.milliseconds=input;}}else if(!!(match=aspNetRegex.exec(input))){sign=(match[1]==='-')?-1:1;duration={y:0,d:toInt(match[DATE])*sign,h:toInt(match[HOUR])*sign,m:toInt(match[MINUTE])*sign,s:toInt(match[SECOND])*sign,ms:toInt(absRound(match[MILLISECOND]*1000))*sign};}else if(!!(match=isoRegex.exec(input))){sign=(match[1]==='-')?-1:1;duration={y:parseIso(match[2],sign),M:parseIso(match[3],sign),w:parseIso(match[4],sign),d:parseIso(match[5],sign),h:parseIso(match[6],sign),m:parseIso(match[7],sign),s:parseIso(match[8],sign)};}else if(duration==null){duration={};}else if(typeof duration==='object'&&('from'in duration||'to'in duration)){diffRes=momentsDifference(createLocal(duration.from),createLocal(duration.to));duration={};duration.ms=diffRes.milliseconds;duration.M=diffRes.months;} +ret=new Duration(duration);if(isDuration(input)&&hasOwnProp(input,'_locale')){ret._locale=input._locale;} +return ret;} +createDuration.fn=Duration.prototype;createDuration.invalid=createInvalid$1;function parseIso(inp,sign){var res=inp&&parseFloat(inp.replace(',','.'));return(isNaN(res)?0:res)*sign;} +function positiveMomentsDifference(base,other){var res={milliseconds:0,months:0};res.months=other.month()-base.month()+(other.year()-base.year())*12;if(base.clone().add(res.months,'M').isAfter(other)){--res.months;} +res.milliseconds=+other-+(base.clone().add(res.months,'M'));return res;} +function momentsDifference(base,other){var res;if(!(base.isValid()&&other.isValid())){return{milliseconds:0,months:0};} +other=cloneWithOffset(other,base);if(base.isBefore(other)){res=positiveMomentsDifference(base,other);}else{res=positiveMomentsDifference(other,base);res.milliseconds=-res.milliseconds;res.months=-res.months;} +return res;} +function createAdder(direction,name){return function(val,period){var dur,tmp;if(period!==null&&!isNaN(+period)){deprecateSimple(name,'moment().'+name+'(period, number) is deprecated. Please use moment().'+name+'(number, period). '+'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');tmp=val;val=period;period=tmp;} +val=typeof val==='string'?+val:val;dur=createDuration(val,period);addSubtract(this,dur,direction);return this;};} +function addSubtract(mom,duration,isAdding,updateOffset){var milliseconds=duration._milliseconds,days=absRound(duration._days),months=absRound(duration._months);if(!mom.isValid()){return;} +updateOffset=updateOffset==null?true:updateOffset;if(milliseconds){mom._d.setTime(mom._d.valueOf()+milliseconds*isAdding);} +if(days){set$1(mom,'Date',get(mom,'Date')+days*isAdding);} +if(months){setMonth(mom,get(mom,'Month')+months*isAdding);} +if(updateOffset){hooks.updateOffset(mom,days||months);}} +var add=createAdder(1,'add');var subtract=createAdder(-1,'subtract');function getCalendarFormat(myMoment,now){var diff=myMoment.diff(now,'days',true);return diff<-6?'sameElse':diff<-1?'lastWeek':diff<0?'lastDay':diff<1?'sameDay':diff<2?'nextDay':diff<7?'nextWeek':'sameElse';} +function calendar$1(time,formats){var now=time||createLocal(),sod=cloneWithOffset(now,this).startOf('day'),format=hooks.calendarFormat(this,sod)||'sameElse';var output=formats&&(isFunction(formats[format])?formats[format].call(this,now):formats[format]);return this.format(output||this.localeData().calendar(format,this,createLocal(now)));} +function clone(){return new Moment(this);} +function isAfter(input,units){var localInput=isMoment(input)?input:createLocal(input);if(!(this.isValid()&&localInput.isValid())){return false;} +units=normalizeUnits(!isUndefined(units)?units:'millisecond');if(units==='millisecond'){return this.valueOf()>localInput.valueOf();}else{return localInput.valueOf()9999){return formatMoment(m,'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');} +if(isFunction(Date.prototype.toISOString)){return this.toDate().toISOString();} +return formatMoment(m,'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');} +function inspect(){if(!this.isValid()){return'moment.invalid(/* '+this._i+' */)';} +var func='moment';var zone='';if(!this.isLocal()){func=this.utcOffset()===0?'moment.utc':'moment.parseZone';zone='Z';} +var prefix='['+func+'("]';var year=(0<=this.year()&&this.year()<=9999)?'YYYY':'YYYYYY';var datetime='-MM-DD[T]HH:mm:ss.SSS';var suffix=zone+'[")]';return this.format(prefix+year+datetime+suffix);} +function format(inputString){if(!inputString){inputString=this.isUtc()?hooks.defaultFormatUtc:hooks.defaultFormat;} +var output=formatMoment(this,inputString);return this.localeData().postformat(output);} +function from(time,withoutSuffix){if(this.isValid()&&((isMoment(time)&&time.isValid())||createLocal(time).isValid())){return createDuration({to:this,from:time}).locale(this.locale()).humanize(!withoutSuffix);}else{return this.localeData().invalidDate();}} +function fromNow(withoutSuffix){return this.from(createLocal(),withoutSuffix);} +function to(time,withoutSuffix){if(this.isValid()&&((isMoment(time)&&time.isValid())||createLocal(time).isValid())){return createDuration({from:this,to:time}).locale(this.locale()).humanize(!withoutSuffix);}else{return this.localeData().invalidDate();}} +function toNow(withoutSuffix){return this.to(createLocal(),withoutSuffix);} +function locale(key){var newLocaleData;if(key===undefined){return this._locale._abbr;}else{newLocaleData=getLocale(key);if(newLocaleData!=null){this._locale=newLocaleData;} +return this;}} +var lang=deprecate('moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',function(key){if(key===undefined){return this.localeData();}else{return this.locale(key);}});function localeData(){return this._locale;} +function startOf(units){units=normalizeUnits(units);switch(units){case'year':this.month(0);case'quarter':case'month':this.date(1);case'week':case'isoWeek':case'day':case'date':this.hours(0);case'hour':this.minutes(0);case'minute':this.seconds(0);case'second':this.milliseconds(0);} +if(units==='week'){this.weekday(0);} +if(units==='isoWeek'){this.isoWeekday(1);} +if(units==='quarter'){this.month(Math.floor(this.month()/3)*3);} +return this;} +function endOf(units){units=normalizeUnits(units);if(units===undefined||units==='millisecond'){return this;} +if(units==='date'){units='day';} +return this.startOf(units).add(1,(units==='isoWeek'?'week':units)).subtract(1,'ms');} +function valueOf(){return this._d.valueOf()-((this._offset||0)*60000);} +function unix(){return Math.floor(this.valueOf()/1000);} +function toDate(){return new Date(this.valueOf());} +function toArray(){var m=this;return[m.year(),m.month(),m.date(),m.hour(),m.minute(),m.second(),m.millisecond()];} +function toObject(){var m=this;return{years:m.year(),months:m.month(),date:m.date(),hours:m.hours(),minutes:m.minutes(),seconds:m.seconds(),milliseconds:m.milliseconds()};} +function toJSON(){return this.isValid()?this.toISOString():null;} +function isValid$2(){return isValid(this);} +function parsingFlags(){return extend({},getParsingFlags(this));} +function invalidAt(){return getParsingFlags(this).overflow;} +function creationData(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict};} +addFormatToken(0,['gg',2],0,function(){return this.weekYear()%100;});addFormatToken(0,['GG',2],0,function(){return this.isoWeekYear()%100;});function addWeekYearFormatToken(token,getter){addFormatToken(0,[token,token.length],0,getter);} +addWeekYearFormatToken('gggg','weekYear');addWeekYearFormatToken('ggggg','weekYear');addWeekYearFormatToken('GGGG','isoWeekYear');addWeekYearFormatToken('GGGGG','isoWeekYear');addUnitAlias('weekYear','gg');addUnitAlias('isoWeekYear','GG');addUnitPriority('weekYear',1);addUnitPriority('isoWeekYear',1);addRegexToken('G',matchSigned);addRegexToken('g',matchSigned);addRegexToken('GG',match1to2,match2);addRegexToken('gg',match1to2,match2);addRegexToken('GGGG',match1to4,match4);addRegexToken('gggg',match1to4,match4);addRegexToken('GGGGG',match1to6,match6);addRegexToken('ggggg',match1to6,match6);addWeekParseToken(['gggg','ggggg','GGGG','GGGGG'],function(input,week,config,token){week[token.substr(0,2)]=toInt(input);});addWeekParseToken(['gg','GG'],function(input,week,config,token){week[token]=hooks.parseTwoDigitYear(input);});function getSetWeekYear(input){return getSetWeekYearHelper.call(this,input,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy);} +function getSetISOWeekYear(input){return getSetWeekYearHelper.call(this,input,this.isoWeek(),this.isoWeekday(),1,4);} +function getISOWeeksInYear(){return weeksInYear(this.year(),1,4);} +function getWeeksInYear(){var weekInfo=this.localeData()._week;return weeksInYear(this.year(),weekInfo.dow,weekInfo.doy);} +function getSetWeekYearHelper(input,week,weekday,dow,doy){var weeksTarget;if(input==null){return weekOfYear(this,dow,doy).year;}else{weeksTarget=weeksInYear(input,dow,doy);if(week>weeksTarget){week=weeksTarget;} +return setWeekAll.call(this,input,week,weekday,dow,doy);}} +function setWeekAll(weekYear,week,weekday,dow,doy){var dayOfYearData=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy),date=createUTCDate(dayOfYearData.year,0,dayOfYearData.dayOfYear);this.year(date.getUTCFullYear());this.month(date.getUTCMonth());this.date(date.getUTCDate());return this;} +addFormatToken('Q',0,'Qo','quarter');addUnitAlias('quarter','Q');addUnitPriority('quarter',7);addRegexToken('Q',match1);addParseToken('Q',function(input,array){array[MONTH]=(toInt(input)-1)*3;});function getSetQuarter(input){return input==null?Math.ceil((this.month()+1)/3):this.month((input-1)*3+this.month()%3);} +addFormatToken('D',['DD',2],'Do','date');addUnitAlias('date','D');addUnitPriority('date',9);addRegexToken('D',match1to2);addRegexToken('DD',match1to2,match2);addRegexToken('Do',function(isStrict,locale){return isStrict?(locale._dayOfMonthOrdinalParse||locale._ordinalParse):locale._dayOfMonthOrdinalParseLenient;});addParseToken(['D','DD'],DATE);addParseToken('Do',function(input,array){array[DATE]=toInt(input.match(match1to2)[0],10);});var getSetDayOfMonth=makeGetSet('Date',true);addFormatToken('DDD',['DDDD',3],'DDDo','dayOfYear');addUnitAlias('dayOfYear','DDD');addUnitPriority('dayOfYear',4);addRegexToken('DDD',match1to3);addRegexToken('DDDD',match3);addParseToken(['DDD','DDDD'],function(input,array,config){config._dayOfYear=toInt(input);});function getSetDayOfYear(input){var dayOfYear=Math.round((this.clone().startOf('day')-this.clone().startOf('year'))/864e5)+1;return input==null?dayOfYear:this.add((input-dayOfYear),'d');} +addFormatToken('m',['mm',2],0,'minute');addUnitAlias('minute','m');addUnitPriority('minute',14);addRegexToken('m',match1to2);addRegexToken('mm',match1to2,match2);addParseToken(['m','mm'],MINUTE);var getSetMinute=makeGetSet('Minutes',false);addFormatToken('s',['ss',2],0,'second');addUnitAlias('second','s');addUnitPriority('second',15);addRegexToken('s',match1to2);addRegexToken('ss',match1to2,match2);addParseToken(['s','ss'],SECOND);var getSetSecond=makeGetSet('Seconds',false);addFormatToken('S',0,0,function(){return~~(this.millisecond()/100);});addFormatToken(0,['SS',2],0,function(){return~~(this.millisecond()/10);});addFormatToken(0,['SSS',3],0,'millisecond');addFormatToken(0,['SSSS',4],0,function(){return this.millisecond()*10;});addFormatToken(0,['SSSSS',5],0,function(){return this.millisecond()*100;});addFormatToken(0,['SSSSSS',6],0,function(){return this.millisecond()*1000;});addFormatToken(0,['SSSSSSS',7],0,function(){return this.millisecond()*10000;});addFormatToken(0,['SSSSSSSS',8],0,function(){return this.millisecond()*100000;});addFormatToken(0,['SSSSSSSSS',9],0,function(){return this.millisecond()*1000000;});addUnitAlias('millisecond','ms');addUnitPriority('millisecond',16);addRegexToken('S',match1to3,match1);addRegexToken('SS',match1to3,match2);addRegexToken('SSS',match1to3,match3);var token;for(token='SSSS';token.length<=9;token+='S'){addRegexToken(token,matchUnsigned);} +function parseMs(input,array){array[MILLISECOND]=toInt(('0.'+input)*1000);} +for(token='S';token.length<=9;token+='S'){addParseToken(token,parseMs);} +var getSetMillisecond=makeGetSet('Milliseconds',false);addFormatToken('z',0,0,'zoneAbbr');addFormatToken('zz',0,0,'zoneName');function getZoneAbbr(){return this._isUTC?'UTC':'';} +function getZoneName(){return this._isUTC?'Coordinated Universal Time':'';} +var proto=Moment.prototype;proto.add=add;proto.calendar=calendar$1;proto.clone=clone;proto.diff=diff;proto.endOf=endOf;proto.format=format;proto.from=from;proto.fromNow=fromNow;proto.to=to;proto.toNow=toNow;proto.get=stringGet;proto.invalidAt=invalidAt;proto.isAfter=isAfter;proto.isBefore=isBefore;proto.isBetween=isBetween;proto.isSame=isSame;proto.isSameOrAfter=isSameOrAfter;proto.isSameOrBefore=isSameOrBefore;proto.isValid=isValid$2;proto.lang=lang;proto.locale=locale;proto.localeData=localeData;proto.max=prototypeMax;proto.min=prototypeMin;proto.parsingFlags=parsingFlags;proto.set=stringSet;proto.startOf=startOf;proto.subtract=subtract;proto.toArray=toArray;proto.toObject=toObject;proto.toDate=toDate;proto.toISOString=toISOString;proto.inspect=inspect;proto.toJSON=toJSON;proto.toString=toString;proto.unix=unix;proto.valueOf=valueOf;proto.creationData=creationData;proto.year=getSetYear;proto.isLeapYear=getIsLeapYear;proto.weekYear=getSetWeekYear;proto.isoWeekYear=getSetISOWeekYear;proto.quarter=proto.quarters=getSetQuarter;proto.month=getSetMonth;proto.daysInMonth=getDaysInMonth;proto.week=proto.weeks=getSetWeek;proto.isoWeek=proto.isoWeeks=getSetISOWeek;proto.weeksInYear=getWeeksInYear;proto.isoWeeksInYear=getISOWeeksInYear;proto.date=getSetDayOfMonth;proto.day=proto.days=getSetDayOfWeek;proto.weekday=getSetLocaleDayOfWeek;proto.isoWeekday=getSetISODayOfWeek;proto.dayOfYear=getSetDayOfYear;proto.hour=proto.hours=getSetHour;proto.minute=proto.minutes=getSetMinute;proto.second=proto.seconds=getSetSecond;proto.millisecond=proto.milliseconds=getSetMillisecond;proto.utcOffset=getSetOffset;proto.utc=setOffsetToUTC;proto.local=setOffsetToLocal;proto.parseZone=setOffsetToParsedOffset;proto.hasAlignedHourOffset=hasAlignedHourOffset;proto.isDST=isDaylightSavingTime;proto.isLocal=isLocal;proto.isUtcOffset=isUtcOffset;proto.isUtc=isUtc;proto.isUTC=isUtc;proto.zoneAbbr=getZoneAbbr;proto.zoneName=getZoneName;proto.dates=deprecate('dates accessor is deprecated. Use date instead.',getSetDayOfMonth);proto.months=deprecate('months accessor is deprecated. Use month instead',getSetMonth);proto.years=deprecate('years accessor is deprecated. Use year instead',getSetYear);proto.zone=deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',getSetZone);proto.isDSTShifted=deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',isDaylightSavingTimeShifted);function createUnix(input){return createLocal(input*1000);} +function createInZone(){return createLocal.apply(null,arguments).parseZone();} +function preParsePostFormat(string){return string;} +var proto$1=Locale.prototype;proto$1.calendar=calendar;proto$1.longDateFormat=longDateFormat;proto$1.invalidDate=invalidDate;proto$1.ordinal=ordinal;proto$1.preparse=preParsePostFormat;proto$1.postformat=preParsePostFormat;proto$1.relativeTime=relativeTime;proto$1.pastFuture=pastFuture;proto$1.set=set;proto$1.months=localeMonths;proto$1.monthsShort=localeMonthsShort;proto$1.monthsParse=localeMonthsParse;proto$1.monthsRegex=monthsRegex;proto$1.monthsShortRegex=monthsShortRegex;proto$1.week=localeWeek;proto$1.firstDayOfYear=localeFirstDayOfYear;proto$1.firstDayOfWeek=localeFirstDayOfWeek;proto$1.weekdays=localeWeekdays;proto$1.weekdaysMin=localeWeekdaysMin;proto$1.weekdaysShort=localeWeekdaysShort;proto$1.weekdaysParse=localeWeekdaysParse;proto$1.weekdaysRegex=weekdaysRegex;proto$1.weekdaysShortRegex=weekdaysShortRegex;proto$1.weekdaysMinRegex=weekdaysMinRegex;proto$1.isPM=localeIsPM;proto$1.meridiem=localeMeridiem;function get$1(format,index,field,setter){var locale=getLocale();var utc=createUTC().set(setter,index);return locale[field](utc,format);} +function listMonthsImpl(format,index,field){if(isNumber(format)){index=format;format=undefined;} +format=format||'';if(index!=null){return get$1(format,index,field,'month');} +var i;var out=[];for(i=0;i<12;i++){out[i]=get$1(format,i,field,'month');} +return out;} +function listWeekdaysImpl(localeSorted,format,index,field){if(typeof localeSorted==='boolean'){if(isNumber(format)){index=format;format=undefined;} +format=format||'';}else{format=localeSorted;index=format;localeSorted=false;if(isNumber(format)){index=format;format=undefined;} +format=format||'';} +var locale=getLocale(),shift=localeSorted?locale._week.dow:0;if(index!=null){return get$1(format,(index+shift)%7,field,'day');} +var i;var out=[];for(i=0;i<7;i++){out[i]=get$1(format,(i+shift)%7,field,'day');} +return out;} +function listMonths(format,index){return listMonthsImpl(format,index,'months');} +function listMonthsShort(format,index){return listMonthsImpl(format,index,'monthsShort');} +function listWeekdays(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,'weekdays');} +function listWeekdaysShort(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,'weekdaysShort');} +function listWeekdaysMin(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,'weekdaysMin');} +getSetGlobalLocale('en',{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(number){var b=number%10,output=(toInt(number%100/10)===1)?'th':(b===1)?'st':(b===2)?'nd':(b===3)?'rd':'th';return number+output;}});hooks.lang=deprecate('moment.lang is deprecated. Use moment.locale instead.',getSetGlobalLocale);hooks.langData=deprecate('moment.langData is deprecated. Use moment.localeData instead.',getLocale);var mathAbs=Math.abs;function abs(){var data=this._data;this._milliseconds=mathAbs(this._milliseconds);this._days=mathAbs(this._days);this._months=mathAbs(this._months);data.milliseconds=mathAbs(data.milliseconds);data.seconds=mathAbs(data.seconds);data.minutes=mathAbs(data.minutes);data.hours=mathAbs(data.hours);data.months=mathAbs(data.months);data.years=mathAbs(data.years);return this;} +function addSubtract$1(duration,input,value,direction){var other=createDuration(input,value);duration._milliseconds+=direction*other._milliseconds;duration._days+=direction*other._days;duration._months+=direction*other._months;return duration._bubble();} +function add$1(input,value){return addSubtract$1(this,input,value,1);} +function subtract$1(input,value){return addSubtract$1(this,input,value,-1);} +function absCeil(number){if(number<0){return Math.floor(number);}else{return Math.ceil(number);}} +function bubble(){var milliseconds=this._milliseconds;var days=this._days;var months=this._months;var data=this._data;var seconds,minutes,hours,years,monthsFromDays;if(!((milliseconds>=0&&days>=0&&months>=0)||(milliseconds<=0&&days<=0&&months<=0))){milliseconds+=absCeil(monthsToDays(months)+days)*864e5;days=0;months=0;} +data.milliseconds=milliseconds%1000;seconds=absFloor(milliseconds/1000);data.seconds=seconds%60;minutes=absFloor(seconds/60);data.minutes=minutes%60;hours=absFloor(minutes/60);data.hours=hours%24;days+=absFloor(hours/24);monthsFromDays=absFloor(daysToMonths(days));months+=monthsFromDays;days-=absCeil(monthsToDays(monthsFromDays));years=absFloor(months/12);months%=12;data.days=days;data.months=months;data.years=years;return this;} +function daysToMonths(days){return days*4800/146097;} +function monthsToDays(months){return months*146097/4800;} +function as(units){if(!this.isValid()){return NaN;} +var days;var months;var milliseconds=this._milliseconds;units=normalizeUnits(units);if(units==='month'||units==='year'){days=this._days+milliseconds/864e5;months=this._months+daysToMonths(days);return units==='month'?months:months/12;}else{days=this._days+Math.round(monthsToDays(this._months));switch(units){case'week':return days/7+milliseconds/6048e5;case'day':return days+milliseconds/864e5;case'hour':return days*24+milliseconds/36e5;case'minute':return days*1440+milliseconds/6e4;case'second':return days*86400+milliseconds/1000;case'millisecond':return Math.floor(days*864e5)+milliseconds;default:throw new Error('Unknown unit '+units);}}} +function valueOf$1(){if(!this.isValid()){return NaN;} +return(this._milliseconds+this._days*864e5+(this._months%12)*2592e6+toInt(this._months/12)*31536e6);} +function makeAs(alias){return function(){return this.as(alias);};} +var asMilliseconds=makeAs('ms');var asSeconds=makeAs('s');var asMinutes=makeAs('m');var asHours=makeAs('h');var asDays=makeAs('d');var asWeeks=makeAs('w');var asMonths=makeAs('M');var asYears=makeAs('y');function get$2(units){units=normalizeUnits(units);return this.isValid()?this[units+'s']():NaN;} +function makeGetter(name){return function(){return this.isValid()?this._data[name]:NaN;};} +var milliseconds=makeGetter('milliseconds');var seconds=makeGetter('seconds');var minutes=makeGetter('minutes');var hours=makeGetter('hours');var days=makeGetter('days');var months=makeGetter('months');var years=makeGetter('years');function weeks(){return absFloor(this.days()/7);} +var round=Math.round;var thresholds={ss:44,s:45,m:45,h:22,d:26,M:11};function substituteTimeAgo(string,number,withoutSuffix,isFuture,locale){return locale.relativeTime(number||1,!!withoutSuffix,string,isFuture);} +function relativeTime$1(posNegDuration,withoutSuffix,locale){var duration=createDuration(posNegDuration).abs();var seconds=round(duration.as('s'));var minutes=round(duration.as('m'));var hours=round(duration.as('h'));var days=round(duration.as('d'));var months=round(duration.as('M'));var years=round(duration.as('y'));var a=seconds<=thresholds.ss&&['s',seconds]||seconds0;a[4]=locale;return substituteTimeAgo.apply(null,a);} +function getSetRelativeTimeRounding(roundingFunction){if(roundingFunction===undefined){return round;} +if(typeof(roundingFunction)==='function'){round=roundingFunction;return true;} +return false;} +function getSetRelativeTimeThreshold(threshold,limit){if(thresholds[threshold]===undefined){return false;} +if(limit===undefined){return thresholds[threshold];} +thresholds[threshold]=limit;if(threshold==='s'){thresholds.ss=limit-1;} +return true;} +function humanize(withSuffix){if(!this.isValid()){return this.localeData().invalidDate();} +var locale=this.localeData();var output=relativeTime$1(this,!withSuffix,locale);if(withSuffix){output=locale.pastFuture(+this,output);} +return locale.postformat(output);} +var abs$1=Math.abs;function toISOString$1(){if(!this.isValid()){return this.localeData().invalidDate();} +var seconds=abs$1(this._milliseconds)/1000;var days=abs$1(this._days);var months=abs$1(this._months);var minutes,hours,years;minutes=absFloor(seconds/60);hours=absFloor(minutes/60);seconds%=60;minutes%=60;years=absFloor(months/12);months%=12;var Y=years;var M=months;var D=days;var h=hours;var m=minutes;var s=seconds;var total=this.asSeconds();if(!total){return'P0D';} +return(total<0?'-':'')+'P'+(Y?Y+'Y':'')+(M?M+'M':'')+(D?D+'D':'')+((h||m||s)?'T':'')+(h?h+'H':'')+(m?m+'M':'')+(s?s+'S':'');} +var proto$2=Duration.prototype;proto$2.isValid=isValid$1;proto$2.abs=abs;proto$2.add=add$1;proto$2.subtract=subtract$1;proto$2.as=as;proto$2.asMilliseconds=asMilliseconds;proto$2.asSeconds=asSeconds;proto$2.asMinutes=asMinutes;proto$2.asHours=asHours;proto$2.asDays=asDays;proto$2.asWeeks=asWeeks;proto$2.asMonths=asMonths;proto$2.asYears=asYears;proto$2.valueOf=valueOf$1;proto$2._bubble=bubble;proto$2.get=get$2;proto$2.milliseconds=milliseconds;proto$2.seconds=seconds;proto$2.minutes=minutes;proto$2.hours=hours;proto$2.days=days;proto$2.weeks=weeks;proto$2.months=months;proto$2.years=years;proto$2.humanize=humanize;proto$2.toISOString=toISOString$1;proto$2.toString=toISOString$1;proto$2.toJSON=toISOString$1;proto$2.locale=locale;proto$2.localeData=localeData;proto$2.toIsoString=deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',toISOString$1);proto$2.lang=lang;addFormatToken('X',0,0,'unix');addFormatToken('x',0,0,'valueOf');addRegexToken('x',matchSigned);addRegexToken('X',matchTimestamp);addParseToken('X',function(input,array,config){config._d=new Date(parseFloat(input,10)*1000);});addParseToken('x',function(input,array,config){config._d=new Date(toInt(input));});hooks.version='2.18.1';setHookCallback(createLocal);hooks.fn=proto;hooks.min=min;hooks.max=max;hooks.now=now;hooks.utc=createUTC;hooks.unix=createUnix;hooks.months=listMonths;hooks.isDate=isDate;hooks.locale=getSetGlobalLocale;hooks.invalid=createInvalid;hooks.duration=createDuration;hooks.isMoment=isMoment;hooks.weekdays=listWeekdays;hooks.parseZone=createInZone;hooks.localeData=getLocale;hooks.isDuration=isDuration;hooks.monthsShort=listMonthsShort;hooks.weekdaysMin=listWeekdaysMin;hooks.defineLocale=defineLocale;hooks.updateLocale=updateLocale;hooks.locales=listLocales;hooks.weekdaysShort=listWeekdaysShort;hooks.normalizeUnits=normalizeUnits;hooks.relativeTimeRounding=getSetRelativeTimeRounding;hooks.relativeTimeThreshold=getSetRelativeTimeThreshold;hooks.calendarFormat=getCalendarFormat;hooks.prototype=proto;return hooks;})));},{}],7:[function(require,module,exports){var Chart=require(28)();require(26)(Chart);require(40)(Chart);require(22)(Chart);require(25)(Chart);require(30)(Chart);require(21)(Chart);require(23)(Chart);require(24)(Chart);require(29)(Chart);require(32)(Chart);require(33)(Chart);require(31)(Chart);require(27)(Chart);require(34)(Chart);require(35)(Chart);require(36)(Chart);require(37)(Chart);require(38)(Chart);require(46)(Chart);require(44)(Chart);require(45)(Chart);require(47)(Chart);require(48)(Chart);require(49)(Chart);require(15)(Chart);require(16)(Chart);require(17)(Chart);require(18)(Chart);require(19)(Chart);require(20)(Chart);require(8)(Chart);require(9)(Chart);require(10)(Chart);require(11)(Chart);require(12)(Chart);require(13)(Chart);require(14)(Chart);var plugins=[];plugins.push(require(41)(Chart),require(42)(Chart),require(43)(Chart));Chart.plugins.register(plugins);module.exports=Chart;if(typeof window!=='undefined'){window.Chart=Chart;}},{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"20":20,"21":21,"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"34":34,"35":35,"36":36,"37":37,"38":38,"40":40,"41":41,"42":42,"43":43,"44":44,"45":45,"46":46,"47":47,"48":48,"49":49,"8":8,"9":9}],8:[function(require,module,exports){'use strict';module.exports=function(Chart){Chart.Bar=function(context,config){config.type='bar';return new Chart(context,config);};};},{}],9:[function(require,module,exports){'use strict';module.exports=function(Chart){Chart.Bubble=function(context,config){config.type='bubble';return new Chart(context,config);};};},{}],10:[function(require,module,exports){'use strict';module.exports=function(Chart){Chart.Doughnut=function(context,config){config.type='doughnut';return new Chart(context,config);};};},{}],11:[function(require,module,exports){'use strict';module.exports=function(Chart){Chart.Line=function(context,config){config.type='line';return new Chart(context,config);};};},{}],12:[function(require,module,exports){'use strict';module.exports=function(Chart){Chart.PolarArea=function(context,config){config.type='polarArea';return new Chart(context,config);};};},{}],13:[function(require,module,exports){'use strict';module.exports=function(Chart){Chart.Radar=function(context,config){config.type='radar';return new Chart(context,config);};};},{}],14:[function(require,module,exports){'use strict';module.exports=function(Chart){var defaultConfig={hover:{mode:'single'},scales:{xAxes:[{type:'linear',position:'bottom',id:'x-axis-1'}],yAxes:[{type:'linear',position:'left',id:'y-axis-1'}]},tooltips:{callbacks:{title:function(){return'';},label:function(tooltipItem){return'('+tooltipItem.xLabel+', '+tooltipItem.yLabel+')';}}}};Chart.defaults.scatter=defaultConfig;Chart.controllers.scatter=Chart.controllers.line;Chart.Scatter=function(context,config){config.type='scatter';return new Chart(context,config);};};},{}],15:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;Chart.defaults.bar={hover:{mode:'label'},scales:{xAxes:[{type:'category',categoryPercentage:0.8,barPercentage:0.9,gridLines:{offsetGridLines:true}}],yAxes:[{type:'linear'}]}};Chart.controllers.bar=Chart.DatasetController.extend({dataElementType:Chart.elements.Rectangle,initialize:function(){var me=this;var meta;Chart.DatasetController.prototype.initialize.apply(me,arguments);meta=me.getMeta();meta.stack=me.getDataset().stack;meta.bar=true;},update:function(reset){var me=this;var elements=me.getMeta().data;var i,ilen;me._ruler=me.getRuler();for(i=0,ilen=elements.length;i=0&&ivalue>0)){start+=ivalue;}}}} +base=scale.getPixelForValue(start);head=scale.getPixelForValue(start+value);size=(head-base)/2;return{size:size,base:base,head:head,center:head+size/2};},calculateBarIndexPixels:function(datasetIndex,index,ruler){var me=this;var scale=ruler.scale;var isCombo=me.chart.isCombo;var stackIndex=me.getStackIndex(datasetIndex);var base=scale.getPixelForValue(null,index,datasetIndex,isCombo);var size=ruler.barSize;base-=isCombo?ruler.tickSize/2:0;base+=ruler.fullBarSize*stackIndex;base+=ruler.categorySpacing/2;base+=ruler.barSpacing/2;return{size:size,base:base,head:base+size,center:base+size/2};},draw:function(){var me=this;var chart=me.chart;var elements=me.getMeta().data;var dataset=me.getDataset();var ilen=elements.length;var i=0;var d;helpers.canvas.clipArea(chart.ctx,chart.chartArea);for(;i0){if(tooltipItems[0].yLabel){title=tooltipItems[0].yLabel;}else if(data.labels.length>0&&tooltipItems[0].index');var data=chart.data;var datasets=data.datasets;var labels=data.labels;if(datasets.length){for(var i=0;i');if(labels[i]){text.push(labels[i]);} +text.push('');}} +text.push('');return text.join('');},legend:{labels:{generateLabels:function(chart){var data=chart.data;if(data.labels.length&&data.datasets.length){return data.labels.map(function(label,i){var meta=chart.getDatasetMeta(0);var ds=data.datasets[0];var arc=meta.data[i];var custom=arc&&arc.custom||{};var getValueAtIndexOrDefault=helpers.getValueAtIndexOrDefault;var arcOpts=chart.options.elements.arc;var fill=custom.backgroundColor?custom.backgroundColor:getValueAtIndexOrDefault(ds.backgroundColor,i,arcOpts.backgroundColor);var stroke=custom.borderColor?custom.borderColor:getValueAtIndexOrDefault(ds.borderColor,i,arcOpts.borderColor);var bw=custom.borderWidth?custom.borderWidth:getValueAtIndexOrDefault(ds.borderWidth,i,arcOpts.borderWidth);return{text:label,fillStyle:fill,strokeStyle:stroke,lineWidth:bw,hidden:isNaN(ds.data[i])||meta.data[i].hidden,index:i};});} +return[];}},onClick:function(e,legendItem){var index=legendItem.index;var chart=this.chart;var i,ilen,meta;for(i=0,ilen=(chart.data.datasets||[]).length;i=Math.PI?-1:startAngle<-Math.PI?1:0);var endAngle=startAngle+circumference;var start={x:Math.cos(startAngle),y:Math.sin(startAngle)};var end={x:Math.cos(endAngle),y:Math.sin(endAngle)};var contains0=(startAngle<=0&&0<=endAngle)||(startAngle<=Math.PI*2.0&&Math.PI*2.0<=endAngle);var contains90=(startAngle<=Math.PI*0.5&&Math.PI*0.5<=endAngle)||(startAngle<=Math.PI*2.5&&Math.PI*2.5<=endAngle);var contains180=(startAngle<=-Math.PI&&-Math.PI<=endAngle)||(startAngle<=Math.PI&&Math.PI<=endAngle);var contains270=(startAngle<=-Math.PI*0.5&&-Math.PI*0.5<=endAngle)||(startAngle<=Math.PI*1.5&&Math.PI*1.5<=endAngle);var cutout=cutoutPercentage/100.0;var min={x:contains180?-1:Math.min(start.x*(start.x<0?1:cutout),end.x*(end.x<0?1:cutout)),y:contains270?-1:Math.min(start.y*(start.y<0?1:cutout),end.y*(end.y<0?1:cutout))};var max={x:contains0?1:Math.max(start.x*(start.x>0?1:cutout),end.x*(end.x>0?1:cutout)),y:contains90?1:Math.max(start.y*(start.y>0?1:cutout),end.y*(end.y>0?1:cutout))};var size={width:(max.x-min.x)*0.5,height:(max.y-min.y)*0.5};minSize=Math.min(availableWidth/size.width,availableHeight/size.height);offset={x:(max.x+min.x)*-0.5,y:(max.y+min.y)*-0.5};} +chart.borderWidth=me.getMaxBorderWidth(meta.data);chart.outerRadius=Math.max((minSize-chart.borderWidth)/2,0);chart.innerRadius=Math.max(cutoutPercentage?(chart.outerRadius/100)*(cutoutPercentage):0,0);chart.radiusLength=(chart.outerRadius-chart.innerRadius)/chart.getVisibleDatasetCount();chart.offsetX=offset.x*chart.outerRadius;chart.offsetY=offset.y*chart.outerRadius;meta.total=me.calculateTotal();me.outerRadius=chart.outerRadius-(chart.radiusLength*me.getRingIndex(me.index));me.innerRadius=Math.max(me.outerRadius-chart.radiusLength,0);helpers.each(meta.data,function(arc,index){me.updateElement(arc,index,reset);});},updateElement:function(arc,index,reset){var me=this;var chart=me.chart,chartArea=chart.chartArea,opts=chart.options,animationOpts=opts.animation,centerX=(chartArea.left+chartArea.right)/2,centerY=(chartArea.top+chartArea.bottom)/2,startAngle=opts.rotation,endAngle=opts.rotation,dataset=me.getDataset(),circumference=reset&&animationOpts.animateRotate?0:arc.hidden?0:me.calculateCircumference(dataset.data[index])*(opts.circumference/(2.0*Math.PI)),innerRadius=reset&&animationOpts.animateScale?0:me.innerRadius,outerRadius=reset&&animationOpts.animateScale?0:me.outerRadius,valueAtIndexOrDefault=helpers.getValueAtIndexOrDefault;helpers.extend(arc,{_datasetIndex:me.index,_index:index,_model:{x:centerX+chart.offsetX,y:centerY+chart.offsetY,startAngle:startAngle,endAngle:endAngle,circumference:circumference,outerRadius:outerRadius,innerRadius:innerRadius,label:valueAtIndexOrDefault(dataset.label,index,chart.data.labels[index])}});var model=arc._model;this.removeHoverStyle(arc);if(!reset||!animationOpts.animateRotate){if(index===0){model.startAngle=opts.rotation;}else{model.startAngle=me.getMeta().data[index-1]._model.endAngle;} +model.endAngle=model.startAngle+model.circumference;} +arc.pivot();},removeHoverStyle:function(arc){Chart.DatasetController.prototype.removeHoverStyle.call(this,arc,this.chart.options.elements.arc);},calculateTotal:function(){var dataset=this.getDataset();var meta=this.getMeta();var total=0;var value;helpers.each(meta.data,function(element,index){value=dataset.data[index];if(!isNaN(value)&&!element.hidden){total+=Math.abs(value);}});return total;},calculateCircumference:function(value){var total=this.getMeta().total;if(total>0&&!isNaN(value)){return(Math.PI*2.0)*(value/total);} +return 0;},getMaxBorderWidth:function(elements){var max=0,index=this.index,length=elements.length,borderWidth,hoverWidth;for(var i=0;imax?borderWidth:max;max=hoverWidth>max?hoverWidth:max;} +return max;}});};},{}],18:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;Chart.defaults.line={showLines:true,spanGaps:false,hover:{mode:'label'},scales:{xAxes:[{type:'category',id:'x-axis-0'}],yAxes:[{type:'linear',id:'y-axis-0'}]}};function lineEnabled(dataset,options){return helpers.getValueOrDefault(dataset.showLine,options.showLines);} +Chart.controllers.line=Chart.DatasetController.extend({datasetElementType:Chart.elements.Line,dataElementType:Chart.elements.Point,update:function(reset){var me=this;var meta=me.getMeta();var line=meta.dataset;var points=meta.data||[];var options=me.chart.options;var lineElementOptions=options.elements.line;var scale=me.getScaleForId(meta.yAxisID);var i,ilen,custom;var dataset=me.getDataset();var showLine=lineEnabled(dataset,options);if(showLine){custom=line.custom||{};if((dataset.tension!==undefined)&&(dataset.lineTension===undefined)){dataset.lineTension=dataset.tension;} +line._scale=scale;line._datasetIndex=me.index;line._children=points;line._model={spanGaps:dataset.spanGaps?dataset.spanGaps:options.spanGaps,tension:custom.tension?custom.tension:helpers.getValueOrDefault(dataset.lineTension,lineElementOptions.tension),backgroundColor:custom.backgroundColor?custom.backgroundColor:(dataset.backgroundColor||lineElementOptions.backgroundColor),borderWidth:custom.borderWidth?custom.borderWidth:(dataset.borderWidth||lineElementOptions.borderWidth),borderColor:custom.borderColor?custom.borderColor:(dataset.borderColor||lineElementOptions.borderColor),borderCapStyle:custom.borderCapStyle?custom.borderCapStyle:(dataset.borderCapStyle||lineElementOptions.borderCapStyle),borderDash:custom.borderDash?custom.borderDash:(dataset.borderDash||lineElementOptions.borderDash),borderDashOffset:custom.borderDashOffset?custom.borderDashOffset:(dataset.borderDashOffset||lineElementOptions.borderDashOffset),borderJoinStyle:custom.borderJoinStyle?custom.borderJoinStyle:(dataset.borderJoinStyle||lineElementOptions.borderJoinStyle),fill:custom.fill?custom.fill:(dataset.fill!==undefined?dataset.fill:lineElementOptions.fill),steppedLine:custom.steppedLine?custom.steppedLine:helpers.getValueOrDefault(dataset.steppedLine,lineElementOptions.stepped),cubicInterpolationMode:custom.cubicInterpolationMode?custom.cubicInterpolationMode:helpers.getValueOrDefault(dataset.cubicInterpolationMode,lineElementOptions.cubicInterpolationMode),};line.pivot();} +for(i=0,ilen=points.length;i');var data=chart.data;var datasets=data.datasets;var labels=data.labels;if(datasets.length){for(var i=0;i');if(labels[i]){text.push(labels[i]);} +text.push('');}} +text.push('');return text.join('');},legend:{labels:{generateLabels:function(chart){var data=chart.data;if(data.labels.length&&data.datasets.length){return data.labels.map(function(label,i){var meta=chart.getDatasetMeta(0);var ds=data.datasets[0];var arc=meta.data[i];var custom=arc.custom||{};var getValueAtIndexOrDefault=helpers.getValueAtIndexOrDefault;var arcOpts=chart.options.elements.arc;var fill=custom.backgroundColor?custom.backgroundColor:getValueAtIndexOrDefault(ds.backgroundColor,i,arcOpts.backgroundColor);var stroke=custom.borderColor?custom.borderColor:getValueAtIndexOrDefault(ds.borderColor,i,arcOpts.borderColor);var bw=custom.borderWidth?custom.borderWidth:getValueAtIndexOrDefault(ds.borderWidth,i,arcOpts.borderWidth);return{text:label,fillStyle:fill,strokeStyle:stroke,lineWidth:bw,hidden:isNaN(ds.data[i])||meta.data[i].hidden,index:i};});} +return[];}},onClick:function(e,legendItem){var index=legendItem.index;var chart=this.chart;var i,ilen,meta;for(i=0,ilen=(chart.data.datasets||[]).length;i0&&!isNaN(value)){return(2*Math.PI)/count;} +return 0;}});};},{}],20:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;Chart.defaults.radar={aspectRatio:1,scale:{type:'radialLinear'},elements:{line:{tension:0}}};Chart.controllers.radar=Chart.DatasetController.extend({datasetElementType:Chart.elements.Line,dataElementType:Chart.elements.Point,linkScales:helpers.noop,update:function(reset){var me=this;var meta=me.getMeta();var line=meta.dataset;var points=meta.data;var custom=line.custom||{};var dataset=me.getDataset();var lineElementOptions=me.chart.options.elements.line;var scale=me.chart.scale;if((dataset.tension!==undefined)&&(dataset.lineTension===undefined)){dataset.lineTension=dataset.tension;} +helpers.extend(meta.dataset,{_datasetIndex:me.index,_scale:scale,_children:points,_loop:true,_model:{tension:custom.tension?custom.tension:helpers.getValueOrDefault(dataset.lineTension,lineElementOptions.tension),backgroundColor:custom.backgroundColor?custom.backgroundColor:(dataset.backgroundColor||lineElementOptions.backgroundColor),borderWidth:custom.borderWidth?custom.borderWidth:(dataset.borderWidth||lineElementOptions.borderWidth),borderColor:custom.borderColor?custom.borderColor:(dataset.borderColor||lineElementOptions.borderColor),fill:custom.fill?custom.fill:(dataset.fill!==undefined?dataset.fill:lineElementOptions.fill),borderCapStyle:custom.borderCapStyle?custom.borderCapStyle:(dataset.borderCapStyle||lineElementOptions.borderCapStyle),borderDash:custom.borderDash?custom.borderDash:(dataset.borderDash||lineElementOptions.borderDash),borderDashOffset:custom.borderDashOffset?custom.borderDashOffset:(dataset.borderDashOffset||lineElementOptions.borderDashOffset),borderJoinStyle:custom.borderJoinStyle?custom.borderJoinStyle:(dataset.borderJoinStyle||lineElementOptions.borderJoinStyle),}});meta.dataset.pivot();helpers.each(points,function(point,index){me.updateElement(point,index,reset);},me);me.updateBezierControlPoints();},updateElement:function(point,index,reset){var me=this;var custom=point.custom||{};var dataset=me.getDataset();var scale=me.chart.scale;var pointElementOptions=me.chart.options.elements.point;var pointPosition=scale.getPointPositionForValue(index,dataset.data[index]);if((dataset.radius!==undefined)&&(dataset.pointRadius===undefined)){dataset.pointRadius=dataset.radius;} +if((dataset.hitRadius!==undefined)&&(dataset.pointHitRadius===undefined)){dataset.pointHitRadius=dataset.hitRadius;} +helpers.extend(point,{_datasetIndex:me.index,_index:index,_scale:scale,_model:{x:reset?scale.xCenter:pointPosition.x,y:reset?scale.yCenter:pointPosition.y,tension:custom.tension?custom.tension:helpers.getValueOrDefault(dataset.lineTension,me.chart.options.elements.line.tension),radius:custom.radius?custom.radius:helpers.getValueAtIndexOrDefault(dataset.pointRadius,index,pointElementOptions.radius),backgroundColor:custom.backgroundColor?custom.backgroundColor:helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor,index,pointElementOptions.backgroundColor),borderColor:custom.borderColor?custom.borderColor:helpers.getValueAtIndexOrDefault(dataset.pointBorderColor,index,pointElementOptions.borderColor),borderWidth:custom.borderWidth?custom.borderWidth:helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth,index,pointElementOptions.borderWidth),pointStyle:custom.pointStyle?custom.pointStyle:helpers.getValueAtIndexOrDefault(dataset.pointStyle,index,pointElementOptions.pointStyle),hitRadius:custom.hitRadius?custom.hitRadius:helpers.getValueAtIndexOrDefault(dataset.pointHitRadius,index,pointElementOptions.hitRadius)}});point._model.skip=custom.skip?custom.skip:(isNaN(point._model.x)||isNaN(point._model.y));},updateBezierControlPoints:function(){var chartArea=this.chart.chartArea;var meta=this.getMeta();helpers.each(meta.data,function(point,index){var model=point._model;var controlPoints=helpers.splineCurve(helpers.previousItem(meta.data,index,true)._model,model,helpers.nextItem(meta.data,index,true)._model,model.tension);model.controlPointPreviousX=Math.max(Math.min(controlPoints.previous.x,chartArea.right),chartArea.left);model.controlPointPreviousY=Math.max(Math.min(controlPoints.previous.y,chartArea.bottom),chartArea.top);model.controlPointNextX=Math.max(Math.min(controlPoints.next.x,chartArea.right),chartArea.left);model.controlPointNextY=Math.max(Math.min(controlPoints.next.y,chartArea.bottom),chartArea.top);point.pivot();});},setHoverStyle:function(point){var dataset=this.chart.data.datasets[point._datasetIndex];var custom=point.custom||{};var index=point._index;var model=point._model;model.radius=custom.hoverRadius?custom.hoverRadius:helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius,index,this.chart.options.elements.point.hoverRadius);model.backgroundColor=custom.hoverBackgroundColor?custom.hoverBackgroundColor:helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor,index,helpers.getHoverColor(model.backgroundColor));model.borderColor=custom.hoverBorderColor?custom.hoverBorderColor:helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor,index,helpers.getHoverColor(model.borderColor));model.borderWidth=custom.hoverBorderWidth?custom.hoverBorderWidth:helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth,index,model.borderWidth);},removeHoverStyle:function(point){var dataset=this.chart.data.datasets[point._datasetIndex];var custom=point.custom||{};var index=point._index;var model=point._model;var pointElementOptions=this.chart.options.elements.point;model.radius=custom.radius?custom.radius:helpers.getValueAtIndexOrDefault(dataset.pointRadius,index,pointElementOptions.radius);model.backgroundColor=custom.backgroundColor?custom.backgroundColor:helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor,index,pointElementOptions.backgroundColor);model.borderColor=custom.borderColor?custom.borderColor:helpers.getValueAtIndexOrDefault(dataset.pointBorderColor,index,pointElementOptions.borderColor);model.borderWidth=custom.borderWidth?custom.borderWidth:helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth,index,pointElementOptions.borderWidth);}});};},{}],21:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;Chart.defaults.global.animation={duration:1000,easing:'easeOutQuart',onProgress:helpers.noop,onComplete:helpers.noop};Chart.Animation=Chart.Element.extend({chart:null,currentStep:0,numSteps:60,easing:'',render:null,onAnimationProgress:null,onAnimationComplete:null,});Chart.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(chart,animation,duration,lazy){var animations=this.animations;var i,ilen;animation.chart=chart;if(!lazy){chart.animating=true;} +for(i=0,ilen=animations.length;i1){framesToDrop=Math.floor(me.dropFrames);me.dropFrames=me.dropFrames%1;} +me.advance(1+framesToDrop);var endTime=Date.now();me.dropFrames+=(endTime-startTime)/me.frameDuration;if(me.animations.length>0){me.requestAnimationFrame();}},advance:function(count){var animations=this.animations;var animation,chart;var i=0;while(i=animation.numSteps){helpers.callback(animation.onAnimationComplete,[animation],chart);chart.animating=false;animations.splice(i,1);}else{++i;}}}};Object.defineProperty(Chart.Animation.prototype,'animationObject',{get:function(){return this;}});Object.defineProperty(Chart.Animation.prototype,'chartInstance',{get:function(){return this.chart;},set:function(value){this.chart=value;}});};},{}],22:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.canvasHelpers={};helpers.drawPoint=function(ctx,pointStyle,radius,x,y){var type,edgeLength,xOffset,yOffset,height,size;if(typeof pointStyle==='object'){type=pointStyle.toString();if(type==='[object HTMLImageElement]'||type==='[object HTMLCanvasElement]'){ctx.drawImage(pointStyle,x-pointStyle.width/2,y-pointStyle.height/2,pointStyle.width,pointStyle.height);return;}} +if(isNaN(radius)||radius<=0){return;} +switch(pointStyle){default:ctx.beginPath();ctx.arc(x,y,radius,0,Math.PI*2);ctx.closePath();ctx.fill();break;case'triangle':ctx.beginPath();edgeLength=3*radius/Math.sqrt(3);height=edgeLength*Math.sqrt(3)/2;ctx.moveTo(x-edgeLength/2,y+height/3);ctx.lineTo(x+edgeLength/2,y+height/3);ctx.lineTo(x,y-2*height/3);ctx.closePath();ctx.fill();break;case'rect':size=1/Math.SQRT2*radius;ctx.beginPath();ctx.fillRect(x-size,y-size,2*size,2*size);ctx.strokeRect(x-size,y-size,2*size,2*size);break;case'rectRounded':var offset=radius/Math.SQRT2;var leftX=x-offset;var topY=y-offset;var sideSize=Math.SQRT2*radius;Chart.helpers.drawRoundedRectangle(ctx,leftX,topY,sideSize,sideSize,radius/2);ctx.fill();break;case'rectRot':size=1/Math.SQRT2*radius;ctx.beginPath();ctx.moveTo(x-size,y);ctx.lineTo(x,y+size);ctx.lineTo(x+size,y);ctx.lineTo(x,y-size);ctx.closePath();ctx.fill();break;case'cross':ctx.beginPath();ctx.moveTo(x,y+radius);ctx.lineTo(x,y-radius);ctx.moveTo(x-radius,y);ctx.lineTo(x+radius,y);ctx.closePath();break;case'crossRot':ctx.beginPath();xOffset=Math.cos(Math.PI/4)*radius;yOffset=Math.sin(Math.PI/4)*radius;ctx.moveTo(x-xOffset,y-yOffset);ctx.lineTo(x+xOffset,y+yOffset);ctx.moveTo(x-xOffset,y+yOffset);ctx.lineTo(x+xOffset,y-yOffset);ctx.closePath();break;case'star':ctx.beginPath();ctx.moveTo(x,y+radius);ctx.lineTo(x,y-radius);ctx.moveTo(x-radius,y);ctx.lineTo(x+radius,y);xOffset=Math.cos(Math.PI/4)*radius;yOffset=Math.sin(Math.PI/4)*radius;ctx.moveTo(x-xOffset,y-yOffset);ctx.lineTo(x+xOffset,y+yOffset);ctx.moveTo(x-xOffset,y+yOffset);ctx.lineTo(x+xOffset,y-yOffset);ctx.closePath();break;case'line':ctx.beginPath();ctx.moveTo(x-radius,y);ctx.lineTo(x+radius,y);ctx.closePath();break;case'dash':ctx.beginPath();ctx.moveTo(x,y);ctx.lineTo(x+radius,y);ctx.closePath();break;} +ctx.stroke();};helpers.clipArea=function(ctx,clipArea){ctx.save();ctx.beginPath();ctx.rect(clipArea.left,clipArea.top,clipArea.right-clipArea.left,clipArea.bottom-clipArea.top);ctx.clip();};helpers.unclipArea=function(ctx){ctx.restore();};helpers.lineTo=function(ctx,previous,target,flip){if(target.steppedLine){if(target.steppedLine==='after'){ctx.lineTo(previous.x,target.y);}else{ctx.lineTo(target.x,previous.y);} +ctx.lineTo(target.x,target.y);return;} +if(!target.tension){ctx.lineTo(target.x,target.y);return;} +ctx.bezierCurveTo(flip?previous.controlPointPreviousX:previous.controlPointNextX,flip?previous.controlPointPreviousY:previous.controlPointNextY,flip?target.controlPointNextX:target.controlPointPreviousX,flip?target.controlPointNextY:target.controlPointPreviousY,target.x,target.y);};Chart.helpers.canvas=helpers;};},{}],23:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;var plugins=Chart.plugins;var platform=Chart.platform;Chart.types={};Chart.instances={};Chart.controllers={};function initConfig(config){config=config||{};var data=config.data=config.data||{};data.datasets=data.datasets||[];data.labels=data.labels||[];config.options=helpers.configMerge(Chart.defaults.global,Chart.defaults[config.type],config.options||{});return config;} +function updateConfig(chart){var newOptions=chart.options;if(newOptions.scale){chart.scale.options=newOptions.scale;}else if(newOptions.scales){newOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions){chart.scales[scaleOptions.id].options=scaleOptions;});} +chart.tooltip._options=newOptions.tooltips;} +function positionIsHorizontal(position){return position==='top'||position==='bottom';} +helpers.extend(Chart.prototype,{construct:function(item,config){var me=this;config=initConfig(config);var context=platform.acquireContext(item,config);var canvas=context&&context.canvas;var height=canvas&&canvas.height;var width=canvas&&canvas.width;me.id=helpers.uid();me.ctx=context;me.canvas=canvas;me.config=config;me.width=width;me.height=height;me.aspectRatio=height?width/height:null;me.options=config.options;me._bufferedRender=false;me.chart=me;me.controller=me;Chart.instances[me.id]=me;Object.defineProperty(me,'data',{get:function(){return me.config.data;},set:function(value){me.config.data=value;}});if(!context||!canvas){console.error("Failed to create chart: can't acquire context from the given item");return;} +me.initialize();me.update();},initialize:function(){var me=this;plugins.notify(me,'beforeInit');helpers.retinaScale(me);me.bindEvents();if(me.options.responsive){me.resize(true);} +me.ensureScalesHaveIDs();me.buildScales();me.initToolTip();plugins.notify(me,'afterInit');return me;},clear:function(){helpers.clear(this);return this;},stop:function(){Chart.animationService.cancelAnimation(this);return this;},resize:function(silent){var me=this;var options=me.options;var canvas=me.canvas;var aspectRatio=(options.maintainAspectRatio&&me.aspectRatio)||null;var newWidth=Math.floor(helpers.getMaximumWidth(canvas));var newHeight=Math.floor(aspectRatio?newWidth/aspectRatio:helpers.getMaximumHeight(canvas));if(me.width===newWidth&&me.height===newHeight){return;} +canvas.width=me.width=newWidth;canvas.height=me.height=newHeight;canvas.style.width=newWidth+'px';canvas.style.height=newHeight+'px';helpers.retinaScale(me);if(!silent){var newSize={width:newWidth,height:newHeight};plugins.notify(me,'resize',[newSize]);if(me.options.onResize){me.options.onResize(me,newSize);} +me.stop();me.update(me.options.responsiveAnimationDuration);}},ensureScalesHaveIDs:function(){var options=this.options;var scalesOptions=options.scales||{};var scaleOptions=options.scale;helpers.each(scalesOptions.xAxes,function(xAxisOptions,index){xAxisOptions.id=xAxisOptions.id||('x-axis-'+index);});helpers.each(scalesOptions.yAxes,function(yAxisOptions,index){yAxisOptions.id=yAxisOptions.id||('y-axis-'+index);});if(scaleOptions){scaleOptions.id=scaleOptions.id||'scale';}},buildScales:function(){var me=this;var options=me.options;var scales=me.scales={};var items=[];if(options.scales){items=items.concat((options.scales.xAxes||[]).map(function(xAxisOptions){return{options:xAxisOptions,dtype:'category',dposition:'bottom'};}),(options.scales.yAxes||[]).map(function(yAxisOptions){return{options:yAxisOptions,dtype:'linear',dposition:'left'};}));} +if(options.scale){items.push({options:options.scale,dtype:'radialLinear',isDefault:true,dposition:'chartArea'});} +helpers.each(items,function(item){var scaleOptions=item.options;var scaleType=helpers.getValueOrDefault(scaleOptions.type,item.dtype);var scaleClass=Chart.scaleService.getScaleConstructor(scaleType);if(!scaleClass){return;} +if(positionIsHorizontal(scaleOptions.position)!==positionIsHorizontal(item.dposition)){scaleOptions.position=item.dposition;} +var scale=new scaleClass({id:scaleOptions.id,options:scaleOptions,ctx:me.ctx,chart:me});scales[scale.id]=scale;if(item.isDefault){me.scale=scale;}});Chart.scaleService.addScalesToLayout(this);},buildOrUpdateControllers:function(){var me=this;var types=[];var newControllers=[];helpers.each(me.data.datasets,function(dataset,datasetIndex){var meta=me.getDatasetMeta(datasetIndex);if(!meta.type){meta.type=dataset.type||me.config.type;} +types.push(meta.type);if(meta.controller){meta.controller.updateIndex(datasetIndex);}else{var ControllerClass=Chart.controllers[meta.type];if(ControllerClass===undefined){throw new Error('"'+meta.type+'" is not a chart type.');} +meta.controller=new ControllerClass(me,datasetIndex);newControllers.push(meta.controller);}},me);if(types.length>1){for(var i=1;i=0;--i){if(me.isDatasetVisible(i)){me.drawDataset(i,easingValue);}} +plugins.notify(me,'afterDatasetsDraw',[easingValue]);},drawDataset:function(index,easingValue){var me=this;var meta=me.getDatasetMeta(index);var args={meta:meta,index:index,easingValue:easingValue};if(plugins.notify(me,'beforeDatasetDraw',[args])===false){return;} +meta.controller.draw(easingValue);plugins.notify(me,'afterDatasetDraw',[args]);},getElementAtEvent:function(e){return Chart.Interaction.modes.single(this,e);},getElementsAtEvent:function(e){return Chart.Interaction.modes.label(this,e,{intersect:true});},getElementsAtXAxis:function(e){return Chart.Interaction.modes['x-axis'](this,e,{intersect:true});},getElementsAtEventForMode:function(e,mode,options){var method=Chart.Interaction.modes[mode];if(typeof method==='function'){return method(this,e,options);} +return[];},getDatasetAtEvent:function(e){return Chart.Interaction.modes.dataset(this,e,{intersect:true});},getDatasetMeta:function(datasetIndex){var me=this;var dataset=me.data.datasets[datasetIndex];if(!dataset._meta){dataset._meta={};} +var meta=dataset._meta[me.id];if(!meta){meta=dataset._meta[me.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null};} +return meta;},getVisibleDatasetCount:function(){var count=0;for(var i=0,ilen=this.data.datasets.length;i0){return;} +arrayEvents.forEach(function(key){delete array[key];});delete array._chartjs;} +Chart.DatasetController=function(chart,datasetIndex){this.initialize(chart,datasetIndex);};helpers.extend(Chart.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(chart,datasetIndex){var me=this;me.chart=chart;me.index=datasetIndex;me.linkScales();me.addElements();},updateIndex:function(datasetIndex){this.index=datasetIndex;},linkScales:function(){var me=this;var meta=me.getMeta();var dataset=me.getDataset();if(meta.xAxisID===null){meta.xAxisID=dataset.xAxisID||me.chart.options.scales.xAxes[0].id;} +if(meta.yAxisID===null){meta.yAxisID=dataset.yAxisID||me.chart.options.scales.yAxes[0].id;}},getDataset:function(){return this.chart.data.datasets[this.index];},getMeta:function(){return this.chart.getDatasetMeta(this.index);},getScaleForId:function(scaleID){return this.chart.scales[scaleID];},reset:function(){this.update(true);},destroy:function(){if(this._data){unlistenArrayEvents(this._data,this);}},createMetaDataset:function(){var me=this;var type=me.datasetElementType;return type&&new type({_chart:me.chart,_datasetIndex:me.index});},createMetaData:function(index){var me=this;var type=me.dataElementType;return type&&new type({_chart:me.chart,_datasetIndex:me.index,_index:index});},addElements:function(){var me=this;var meta=me.getMeta();var data=me.getDataset().data||[];var metaData=meta.data;var i,ilen;for(i=0,ilen=data.length;inumMeta){me.insertElements(numMeta,numData-numMeta);}},insertElements:function(start,count){for(var i=0;i=0;i--){callback.call(self,loopable[i],i);}}else{for(i=0;i=base[key].length||!base[key][index].type){base[key].push(helpers.configMerge(axisDefaults,valueObj));}else if(valueObj.type&&valueObj.type!==base[key][index].type){base[key][index]=helpers.configMerge(base[key][index],axisDefaults,valueObj);}else{base[key][index]=helpers.configMerge(base[key][index],valueObj);}});}else{base[key]=[];helpers.each(value,function(valueObj){var axisType=helpers.getValueOrDefault(valueObj.type,key==='xAxes'?'category':'linear');base[key].push(helpers.configMerge(Chart.scaleService.getScaleDefaults(axisType),valueObj));});}}else if(base.hasOwnProperty(key)&&typeof base[key]==='object'&&base[key]!==null&&typeof value==='object'){base[key]=helpers.configMerge(base[key],value);}else{base[key]=value;}});return base;};helpers.getValueAtIndexOrDefault=function(value,index,defaultValue){if(value===undefined||value===null){return defaultValue;} +if(helpers.isArray(value)){return index=0;i--){var currentItem=arrayToSearch[i];if(filterCallback(currentItem)){return currentItem;}}};helpers.inherits=function(extensions){var me=this;var ChartElement=(extensions&&extensions.hasOwnProperty('constructor'))?extensions.constructor:function(){return me.apply(this,arguments);};var Surrogate=function(){this.constructor=ChartElement;};Surrogate.prototype=me.prototype;ChartElement.prototype=new Surrogate();ChartElement.extend=helpers.inherits;if(extensions){helpers.extend(ChartElement.prototype,extensions);} +ChartElement.__super__=me.prototype;return ChartElement;};helpers.noop=function(){};helpers.uid=(function(){var id=0;return function(){return id++;};}());helpers.isNumber=function(n){return!isNaN(parseFloat(n))&&isFinite(n);};helpers.almostEquals=function(x,y,epsilon){return Math.abs(x-y)x));};helpers.max=function(array){return array.reduce(function(max,value){if(!isNaN(value)){return Math.max(max,value);} +return max;},Number.NEGATIVE_INFINITY);};helpers.min=function(array){return array.reduce(function(min,value){if(!isNaN(value)){return Math.min(min,value);} +return min;},Number.POSITIVE_INFINITY);};helpers.sign=Math.sign?function(x){return Math.sign(x);}:function(x){x=+x;if(x===0||isNaN(x)){return x;} +return x>0?1:-1;};helpers.log10=Math.log10?function(x){return Math.log10(x);}:function(x){return Math.log(x)/Math.LN10;};helpers.toRadians=function(degrees){return degrees*(Math.PI/180);};helpers.toDegrees=function(radians){return radians*(180/Math.PI);};helpers.getAngleFromPoint=function(centrePoint,anglePoint){var distanceFromXCenter=anglePoint.x-centrePoint.x,distanceFromYCenter=anglePoint.y-centrePoint.y,radialDistanceFromCenter=Math.sqrt(distanceFromXCenter*distanceFromXCenter+distanceFromYCenter*distanceFromYCenter);var angle=Math.atan2(distanceFromYCenter,distanceFromXCenter);if(angle<(-0.5*Math.PI)){angle+=2.0*Math.PI;} +return{angle:angle,distance:radialDistanceFromCenter};};helpers.distanceBetweenPoints=function(pt1,pt2){return Math.sqrt(Math.pow(pt2.x-pt1.x,2)+Math.pow(pt2.y-pt1.y,2));};helpers.aliasPixel=function(pixelWidth){return(pixelWidth%2===0)?0:0.5;};helpers.splineCurve=function(firstPoint,middlePoint,afterPoint,t){var previous=firstPoint.skip?middlePoint:firstPoint,current=middlePoint,next=afterPoint.skip?middlePoint:afterPoint;var d01=Math.sqrt(Math.pow(current.x-previous.x,2)+Math.pow(current.y-previous.y,2));var d12=Math.sqrt(Math.pow(next.x-current.x,2)+Math.pow(next.y-current.y,2));var s01=d01/(d01+d12);var s12=d12/(d01+d12);s01=isNaN(s01)?0:s01;s12=isNaN(s12)?0:s12;var fa=t*s01;var fb=t*s12;return{previous:{x:current.x-fa*(next.x-previous.x),y:current.y-fa*(next.y-previous.y)},next:{x:current.x+fb*(next.x-previous.x),y:current.y+fb*(next.y-previous.y)}};};helpers.EPSILON=Number.EPSILON||1e-14;helpers.splineCurveMonotone=function(points){var pointsWithTangents=(points||[]).map(function(point){return{model:point._model,deltaK:0,mK:0};});var pointsLen=pointsWithTangents.length;var i,pointBefore,pointCurrent,pointAfter;for(i=0;i0?pointsWithTangents[i-1]:null;pointAfter=i0?pointsWithTangents[i-1]:null;pointAfter=i=collection.length-1?collection[0]:collection[index+1];} +return index>=collection.length-1?collection[collection.length-1]:collection[index+1];};helpers.previousItem=function(collection,index,loop){if(loop){return index<=0?collection[collection.length-1]:collection[index-1];} +return index<=0?collection[0]:collection[index-1];};helpers.niceNum=function(range,round){var exponent=Math.floor(helpers.log10(range));var fraction=range/Math.pow(10,exponent);var niceFraction;if(round){if(fraction<1.5){niceFraction=1;}else if(fraction<3){niceFraction=2;}else if(fraction<7){niceFraction=5;}else{niceFraction=10;}}else if(fraction<=1.0){niceFraction=1;}else if(fraction<=2){niceFraction=2;}else if(fraction<=5){niceFraction=5;}else{niceFraction=10;} +return niceFraction*Math.pow(10,exponent);};var easingEffects=helpers.easingEffects={linear:function(t){return t;},easeInQuad:function(t){return t*t;},easeOutQuad:function(t){return-1*t*(t-2);},easeInOutQuad:function(t){if((t/=1/2)<1){return 1/2*t*t;} +return-1/2*((--t)*(t-2)-1);},easeInCubic:function(t){return t*t*t;},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1);},easeInOutCubic:function(t){if((t/=1/2)<1){return 1/2*t*t*t;} +return 1/2*((t-=2)*t*t+2);},easeInQuart:function(t){return t*t*t*t;},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1);},easeInOutQuart:function(t){if((t/=1/2)<1){return 1/2*t*t*t*t;} +return-1/2*((t-=2)*t*t*t-2);},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t;},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1);},easeInOutQuint:function(t){if((t/=1/2)<1){return 1/2*t*t*t*t*t;} +return 1/2*((t-=2)*t*t*t*t+2);},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1;},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2));},easeInOutSine:function(t){return-1/2*(Math.cos(Math.PI*t/1)-1);},easeInExpo:function(t){return(t===0)?1:1*Math.pow(2,10*(t/1-1));},easeOutExpo:function(t){return(t===1)?1:1*(-Math.pow(2,-10*t/1)+1);},easeInOutExpo:function(t){if(t===0){return 0;} +if(t===1){return 1;} +if((t/=1/2)<1){return 1/2*Math.pow(2,10*(t-1));} +return 1/2*(-Math.pow(2,-10*--t)+2);},easeInCirc:function(t){if(t>=1){return t;} +return-1*(Math.sqrt(1-(t/=1)*t)-1);},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t);},easeInOutCirc:function(t){if((t/=1/2)<1){return-1/2*(Math.sqrt(1-t*t)-1);} +return 1/2*(Math.sqrt(1-(t-=2)*t)+1);},easeInElastic:function(t){var s=1.70158;var p=0;var a=1;if(t===0){return 0;} +if((t/=1)===1){return 1;} +if(!p){p=1*0.3;} +if(a0){mouseX=touches[0].clientX;mouseY=touches[0].clientY;}else{mouseX=e.clientX;mouseY=e.clientY;} +var paddingLeft=parseFloat(helpers.getStyle(canvas,'padding-left'));var paddingTop=parseFloat(helpers.getStyle(canvas,'padding-top'));var paddingRight=parseFloat(helpers.getStyle(canvas,'padding-right'));var paddingBottom=parseFloat(helpers.getStyle(canvas,'padding-bottom'));var width=boundingRect.right-boundingRect.left-paddingLeft-paddingRight;var height=boundingRect.bottom-boundingRect.top-paddingTop-paddingBottom;mouseX=Math.round((mouseX-boundingRect.left-paddingLeft)/(width)*canvas.width/chart.currentDevicePixelRatio);mouseY=Math.round((mouseY-boundingRect.top-paddingTop)/(height)*canvas.height/chart.currentDevicePixelRatio);return{x:mouseX,y:mouseY};};helpers.addEvent=function(node,eventType,method){if(node.addEventListener){node.addEventListener(eventType,method);}else if(node.attachEvent){node.attachEvent('on'+eventType,method);}else{node['on'+eventType]=method;}};helpers.removeEvent=function(node,eventType,handler){if(node.removeEventListener){node.removeEventListener(eventType,handler,false);}else if(node.detachEvent){node.detachEvent('on'+eventType,handler);}else{node['on'+eventType]=helpers.noop;}};function parseMaxStyle(styleValue,node,parentProperty){var valueInPixels;if(typeof(styleValue)==='string'){valueInPixels=parseInt(styleValue,10);if(styleValue.indexOf('%')!==-1){valueInPixels=valueInPixels/100*node.parentNode[parentProperty];}}else{valueInPixels=styleValue;} +return valueInPixels;} +function isConstrainedValue(value){return value!==undefined&&value!==null&&value!=='none';} +function getConstraintDimension(domNode,maxStyle,percentageProperty){var view=document.defaultView;var parentNode=domNode.parentNode;var constrainedNode=view.getComputedStyle(domNode)[maxStyle];var constrainedContainer=view.getComputedStyle(parentNode)[maxStyle];var hasCNode=isConstrainedValue(constrainedNode);var hasCContainer=isConstrainedValue(constrainedContainer);var infinity=Number.POSITIVE_INFINITY;if(hasCNode||hasCContainer){return Math.min(hasCNode?parseMaxStyle(constrainedNode,domNode,percentageProperty):infinity,hasCContainer?parseMaxStyle(constrainedContainer,parentNode,percentageProperty):infinity);} +return'none';} +helpers.getConstraintWidth=function(domNode){return getConstraintDimension(domNode,'max-width','clientWidth');};helpers.getConstraintHeight=function(domNode){return getConstraintDimension(domNode,'max-height','clientHeight');};helpers.getMaximumWidth=function(domNode){var container=domNode.parentNode;var paddingLeft=parseInt(helpers.getStyle(container,'padding-left'),10);var paddingRight=parseInt(helpers.getStyle(container,'padding-right'),10);var w=container.clientWidth-paddingLeft-paddingRight;var cw=helpers.getConstraintWidth(domNode);return isNaN(cw)?w:Math.min(w,cw);};helpers.getMaximumHeight=function(domNode){var container=domNode.parentNode;var paddingTop=parseInt(helpers.getStyle(container,'padding-top'),10);var paddingBottom=parseInt(helpers.getStyle(container,'padding-bottom'),10);var h=container.clientHeight-paddingTop-paddingBottom;var ch=helpers.getConstraintHeight(domNode);return isNaN(ch)?h:Math.min(h,ch);};helpers.getStyle=function(el,property){return el.currentStyle?el.currentStyle[property]:document.defaultView.getComputedStyle(el,null).getPropertyValue(property);};helpers.retinaScale=function(chart){var pixelRatio=chart.currentDevicePixelRatio=window.devicePixelRatio||1;if(pixelRatio===1){return;} +var canvas=chart.canvas;var height=chart.height;var width=chart.width;canvas.height=height*pixelRatio;canvas.width=width*pixelRatio;chart.ctx.scale(pixelRatio,pixelRatio);canvas.style.height=height+'px';canvas.style.width=width+'px';};helpers.clear=function(chart){chart.ctx.clearRect(0,0,chart.width,chart.height);};helpers.fontString=function(pixelSize,fontStyle,fontFamily){return fontStyle+' '+pixelSize+'px '+fontFamily;};helpers.longestText=function(ctx,font,arrayOfThings,cache){cache=cache||{};var data=cache.data=cache.data||{};var gc=cache.garbageCollect=cache.garbageCollect||[];if(cache.font!==font){data=cache.data={};gc=cache.garbageCollect=[];cache.font=font;} +ctx.font=font;var longest=0;helpers.each(arrayOfThings,function(thing){if(thing!==undefined&&thing!==null&&helpers.isArray(thing)!==true){longest=helpers.measureText(ctx,data,gc,longest,thing);}else if(helpers.isArray(thing)){helpers.each(thing,function(nestedThing){if(nestedThing!==undefined&&nestedThing!==null&&!helpers.isArray(nestedThing)){longest=helpers.measureText(ctx,data,gc,longest,nestedThing);}});}});var gcLen=gc.length/2;if(gcLen>arrayOfThings.length){for(var i=0;ilongest){longest=textWidth;} +return longest;};helpers.numberOfLabelLines=function(arrayOfThings){var numberOfLines=1;helpers.each(arrayOfThings,function(thing){if(helpers.isArray(thing)){if(thing.length>numberOfLines){numberOfLines=thing.length;}}});return numberOfLines;};helpers.drawRoundedRectangle=function(ctx,x,y,width,height,radius){ctx.beginPath();ctx.moveTo(x+radius,y);ctx.lineTo(x+width-radius,y);ctx.quadraticCurveTo(x+width,y,x+width,y+radius);ctx.lineTo(x+width,y+height-radius);ctx.quadraticCurveTo(x+width,y+height,x+width-radius,y+height);ctx.lineTo(x+radius,y+height);ctx.quadraticCurveTo(x,y+height,x,y+height-radius);ctx.lineTo(x,y+radius);ctx.quadraticCurveTo(x,y,x+radius,y);ctx.closePath();};helpers.color=!color?function(value){console.error('Color.js not found!');return value;}:function(value){if(value instanceof CanvasGradient){value=Chart.defaults.global.defaultColor;} +return color(value);};helpers.isArray=Array.isArray?function(obj){return Array.isArray(obj);}:function(obj){return Object.prototype.toString.call(obj)==='[object Array]';};helpers.arrayEquals=function(a0,a1){var i,ilen,v0,v1;if(!a0||!a1||a0.length!==a1.length){return false;} +for(i=0,ilen=a0.length;i0){items=chart.getDatasetMeta(items[0]._datasetIndex).data;} +return items;},'x-axis':function(chart,e){return indexMode(chart,e,true);},point:function(chart,e){var position=getRelativePosition(e,chart);return getIntersectItems(chart,position);},nearest:function(chart,e,options){var position=getRelativePosition(e,chart);var nearestItems=getNearestItems(chart,position,options.intersect);if(nearestItems.length>1){nearestItems.sort(function(a,b){var sizeA=a.getArea();var sizeB=b.getArea();var ret=sizeA-sizeB;if(ret===0){ret=a._datasetIndex-b._datasetIndex;} +return ret;});} +return nearestItems.slice(0,1);},x:function(chart,e,options){var position=getRelativePosition(e,chart);var items=[];var intersectsItem=false;parseVisibleItems(chart,function(element){if(element.inXRange(position.x)){items.push(element);} +if(element.inRange(position.x,position.y)){intersectsItem=true;}});if(options.intersect&&!intersectsItem){items=[];} +return items;},y:function(chart,e,options){var position=getRelativePosition(e,chart);var items=[];var intersectsItem=false;parseVisibleItems(chart,function(element){if(element.inYRange(position.y)){items.push(element);} +if(element.inRange(position.x,position.y)){intersectsItem=true;}});if(options.intersect&&!intersectsItem){items=[];} +return items;}}};};},{}],28:[function(require,module,exports){'use strict';module.exports=function(){var Chart=function(item,config){this.construct(item,config);return this;};Chart.defaults={global:{responsive:true,responsiveAnimationDuration:0,maintainAspectRatio:true,events:['mousemove','mouseout','click','touchstart','touchmove'],hover:{onHover:null,mode:'nearest',intersect:true,animationDuration:400},onClick:null,defaultColor:'rgba(0,0,0,0.1)',defaultFontColor:'#666',defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:'normal',showLines:true,elements:{},legendCallback:function(chart){var text=[];text.push('
    ');for(var i=0;i');if(chart.data.datasets[i].label){text.push(chart.data.datasets[i].label);} +text.push('');} +text.push('
');return text.join('');}}};Chart.Chart=Chart;return Chart;};},{}],29:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;function filterByPosition(array,position){return helpers.where(array,function(v){return v.position===position;});} +function sortByWeight(array,reverse){array.forEach(function(v,i){v._tmpIndex_=i;return v;});array.sort(function(a,b){var v0=reverse?b:a;var v1=reverse?a:b;return v0.weight===v1.weight?v0._tmpIndex_-v1._tmpIndex_:v0.weight-v1.weight;});array.forEach(function(v){delete v._tmpIndex_;});} +Chart.layoutService={defaults:{},addBox:function(chart,item){if(!chart.boxes){chart.boxes=[];} +item.fullWidth=item.fullWidth||false;item.position=item.position||'top';item.weight=item.weight||0;chart.boxes.push(item);},removeBox:function(chart,layoutItem){var index=chart.boxes?chart.boxes.indexOf(layoutItem):-1;if(index!==-1){chart.boxes.splice(index,1);}},configure:function(chart,item,options){var props=['fullWidth','position','weight'];var ilen=props.length;var i=0;var prop;for(;itickWidth&&labelRotationme.maxHeight){labelRotation--;break;} +labelRotation++;labelWidth=cosRotation*originalLabelWidth;}} +me.labelRotation=labelRotation;},afterCalculateTickRotation:function(){helpers.callback(this.options.afterCalculateTickRotation,[this]);},beforeFit:function(){helpers.callback(this.options.beforeFit,[this]);},fit:function(){var me=this;var minSize=me.minSize={width:0,height:0};var opts=me.options;var tickOpts=opts.ticks;var scaleLabelOpts=opts.scaleLabel;var gridLineOpts=opts.gridLines;var display=opts.display;var isHorizontal=me.isHorizontal();var tickFont=parseFontOptions(tickOpts);var scaleLabelFontSize=parseFontOptions(scaleLabelOpts).size*1.5;var tickMarkLength=opts.gridLines.tickMarkLength;if(isHorizontal){minSize.width=me.isFullWidth()?me.maxWidth-me.margins.left-me.margins.right:me.maxWidth;}else{minSize.width=display&&gridLineOpts.drawTicks?tickMarkLength:0;} +if(isHorizontal){minSize.height=display&&gridLineOpts.drawTicks?tickMarkLength:0;}else{minSize.height=me.maxHeight;} +if(scaleLabelOpts.display&&display){if(isHorizontal){minSize.height+=scaleLabelFontSize;}else{minSize.width+=scaleLabelFontSize;}} +if(tickOpts.display&&display){var largestTextWidth=helpers.longestText(me.ctx,tickFont.font,me.ticks,me.longestTextCache);var tallestLabelHeightInLines=helpers.numberOfLabelLines(me.ticks);var lineSpace=tickFont.size*0.5;if(isHorizontal){me.longestLabelWidth=largestTextWidth;var angleRadians=helpers.toRadians(me.labelRotation);var cosRotation=Math.cos(angleRadians);var sinRotation=Math.sin(angleRadians);var labelHeight=(sinRotation*largestTextWidth)+(tickFont.size*tallestLabelHeightInLines)+(lineSpace*tallestLabelHeightInLines);minSize.height=Math.min(me.maxHeight,minSize.height+labelHeight);me.ctx.font=tickFont.font;var firstTick=me.ticks[0];var firstLabelWidth=computeTextSize(me.ctx,firstTick,tickFont.font);var lastTick=me.ticks[me.ticks.length-1];var lastLabelWidth=computeTextSize(me.ctx,lastTick,tickFont.font);if(me.labelRotation!==0){me.paddingLeft=opts.position==='bottom'?(cosRotation*firstLabelWidth)+3:(cosRotation*lineSpace)+3;me.paddingRight=opts.position==='bottom'?(cosRotation*lineSpace)+3:(cosRotation*lastLabelWidth)+3;}else{me.paddingLeft=firstLabelWidth/2+3;me.paddingRight=lastLabelWidth/2+3;}}else{if(tickOpts.mirror){largestTextWidth=0;}else{largestTextWidth+=me.options.ticks.padding;} +minSize.width=Math.min(me.maxWidth,minSize.width+largestTextWidth);me.paddingTop=tickFont.size/2;me.paddingBottom=tickFont.size/2;}} +me.handleMargins();me.width=minSize.width;me.height=minSize.height;},handleMargins:function(){var me=this;if(me.margins){me.paddingLeft=Math.max(me.paddingLeft-me.margins.left,0);me.paddingTop=Math.max(me.paddingTop-me.margins.top,0);me.paddingRight=Math.max(me.paddingRight-me.margins.right,0);me.paddingBottom=Math.max(me.paddingBottom-me.margins.bottom,0);}},afterFit:function(){helpers.callback(this.options.afterFit,[this]);},isHorizontal:function(){return this.options.position==='top'||this.options.position==='bottom';},isFullWidth:function(){return(this.options.fullWidth);},getRightValue:function(rawValue){if(rawValue===null||typeof(rawValue)==='undefined'){return NaN;} +if(typeof(rawValue)==='number'&&!isFinite(rawValue)){return NaN;} +if(typeof(rawValue)==='object'){if((rawValue instanceof Date)||(rawValue.isValid)){return rawValue;} +return this.getRightValue(this.isHorizontal()?rawValue.x:rawValue.y);} +return rawValue;},getLabelForIndex:helpers.noop,getPixelForValue:helpers.noop,getValueForPixel:helpers.noop,getPixelForTick:function(index,includeOffset){var me=this;if(me.isHorizontal()){var innerWidth=me.width-(me.paddingLeft+me.paddingRight);var tickWidth=innerWidth/Math.max((me.ticks.length-((me.options.gridLines.offsetGridLines)?0:1)),1);var pixel=(tickWidth*index)+me.paddingLeft;if(includeOffset){pixel+=tickWidth/2;} +var finalVal=me.left+Math.round(pixel);finalVal+=me.isFullWidth()?me.margins.left:0;return finalVal;} +var innerHeight=me.height-(me.paddingTop+me.paddingBottom);return me.top+(index*(innerHeight/(me.ticks.length-1)));},getPixelForDecimal:function(decimal){var me=this;if(me.isHorizontal()){var innerWidth=me.width-(me.paddingLeft+me.paddingRight);var valueOffset=(innerWidth*decimal)+me.paddingLeft;var finalVal=me.left+Math.round(valueOffset);finalVal+=me.isFullWidth()?me.margins.left:0;return finalVal;} +return me.top+(decimal*me.height);},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue());},getBaseValue:function(){var me=this;var min=me.min;var max=me.max;return me.beginAtZero?0:min<0&&max<0?max:min>0&&max>0?min:0;},draw:function(chartArea){var me=this;var options=me.options;if(!options.display){return;} +var context=me.ctx;var globalDefaults=Chart.defaults.global;var optionTicks=options.ticks;var gridLines=options.gridLines;var scaleLabel=options.scaleLabel;var isRotated=me.labelRotation!==0;var skipRatio;var useAutoskipper=optionTicks.autoSkip;var isHorizontal=me.isHorizontal();var maxTicks;if(optionTicks.maxTicksLimit){maxTicks=optionTicks.maxTicksLimit;} +var tickFontColor=helpers.getValueOrDefault(optionTicks.fontColor,globalDefaults.defaultFontColor);var tickFont=parseFontOptions(optionTicks);var tl=gridLines.drawTicks?gridLines.tickMarkLength:0;var scaleLabelFontColor=helpers.getValueOrDefault(scaleLabel.fontColor,globalDefaults.defaultFontColor);var scaleLabelFont=parseFontOptions(scaleLabel);var labelRotationRadians=helpers.toRadians(me.labelRotation);var cosRotation=Math.cos(labelRotationRadians);var longestRotatedLabel=me.longestLabelWidth*cosRotation;context.fillStyle=tickFontColor;var itemsToDraw=[];if(isHorizontal){skipRatio=false;if((longestRotatedLabel+optionTicks.autoSkipPadding)*me.ticks.length>(me.width-(me.paddingLeft+me.paddingRight))){skipRatio=1+Math.floor(((longestRotatedLabel+optionTicks.autoSkipPadding)*me.ticks.length)/(me.width-(me.paddingLeft+me.paddingRight)));} +if(maxTicks&&me.ticks.length>maxTicks){while(!skipRatio||me.ticks.length/(skipRatio||1)>maxTicks){if(!skipRatio){skipRatio=1;} +skipRatio+=1;}} +if(!useAutoskipper){skipRatio=false;}} +var xTickStart=options.position==='right'?me.left:me.right-tl;var xTickEnd=options.position==='right'?me.left+tl:me.right;var yTickStart=options.position==='bottom'?me.top:me.bottom-tl;var yTickEnd=options.position==='bottom'?me.top+tl:me.bottom;helpers.each(me.ticks,function(label,index){if(label===undefined||label===null){return;} +var isLastTick=me.ticks.length===index+1;var shouldSkip=(skipRatio>1&&index%skipRatio>0)||(index%skipRatio===0&&index+skipRatio>=me.ticks.length);if(shouldSkip&&!isLastTick||(label===undefined||label===null)){return;} +var lineWidth,lineColor,borderDash,borderDashOffset;if(index===(typeof me.zeroLineIndex!=='undefined'?me.zeroLineIndex:0)){lineWidth=gridLines.zeroLineWidth;lineColor=gridLines.zeroLineColor;borderDash=gridLines.zeroLineBorderDash;borderDashOffset=gridLines.zeroLineBorderDashOffset;}else{lineWidth=helpers.getValueAtIndexOrDefault(gridLines.lineWidth,index);lineColor=helpers.getValueAtIndexOrDefault(gridLines.color,index);borderDash=helpers.getValueOrDefault(gridLines.borderDash,globalDefaults.borderDash);borderDashOffset=helpers.getValueOrDefault(gridLines.borderDashOffset,globalDefaults.borderDashOffset);} +var tx1,ty1,tx2,ty2,x1,y1,x2,y2,labelX,labelY;var textAlign='middle';var textBaseline='middle';if(isHorizontal){if(options.position==='bottom'){textBaseline=!isRotated?'top':'middle';textAlign=!isRotated?'center':'right';labelY=me.top+tl;}else{textBaseline=!isRotated?'bottom':'middle';textAlign=!isRotated?'center':'left';labelY=me.bottom-tl;} +var xLineValue=me.getPixelForTick(index)+helpers.aliasPixel(lineWidth);labelX=me.getPixelForTick(index,gridLines.offsetGridLines)+optionTicks.labelOffset;tx1=tx2=x1=x2=xLineValue;ty1=yTickStart;ty2=yTickEnd;y1=chartArea.top;y2=chartArea.bottom;}else{var isLeft=options.position==='left';var tickPadding=optionTicks.padding;var labelXOffset;if(optionTicks.mirror){textAlign=isLeft?'left':'right';labelXOffset=tickPadding;}else{textAlign=isLeft?'right':'left';labelXOffset=tl+tickPadding;} +labelX=isLeft?me.right-labelXOffset:me.left+labelXOffset;var yLineValue=me.getPixelForTick(index);yLineValue+=helpers.aliasPixel(lineWidth);labelY=me.getPixelForTick(index,gridLines.offsetGridLines);tx1=xTickStart;tx2=xTickEnd;x1=chartArea.left;x2=chartArea.right;ty1=ty2=y1=y2=yLineValue;} +itemsToDraw.push({tx1:tx1,ty1:ty1,tx2:tx2,ty2:ty2,x1:x1,y1:y1,x2:x2,y2:y2,labelX:labelX,labelY:labelY,glWidth:lineWidth,glColor:lineColor,glBorderDash:borderDash,glBorderDashOffset:borderDashOffset,rotation:-1*labelRotationRadians,label:label,textBaseline:textBaseline,textAlign:textAlign});});helpers.each(itemsToDraw,function(itemToDraw){if(gridLines.display){context.save();context.lineWidth=itemToDraw.glWidth;context.strokeStyle=itemToDraw.glColor;if(context.setLineDash){context.setLineDash(itemToDraw.glBorderDash);context.lineDashOffset=itemToDraw.glBorderDashOffset;} +context.beginPath();if(gridLines.drawTicks){context.moveTo(itemToDraw.tx1,itemToDraw.ty1);context.lineTo(itemToDraw.tx2,itemToDraw.ty2);} +if(gridLines.drawOnChartArea){context.moveTo(itemToDraw.x1,itemToDraw.y1);context.lineTo(itemToDraw.x2,itemToDraw.y2);} +context.stroke();context.restore();} +if(optionTicks.display){context.save();context.translate(itemToDraw.labelX,itemToDraw.labelY);context.rotate(itemToDraw.rotation);context.font=tickFont.font;context.textBaseline=itemToDraw.textBaseline;context.textAlign=itemToDraw.textAlign;var label=itemToDraw.label;if(helpers.isArray(label)){for(var i=0,y=0;i0){spacing=generationOptions.stepSize;}else{var niceRange=helpers.niceNum(dataRange.max-dataRange.min,false);spacing=helpers.niceNum(niceRange/(generationOptions.maxTicks-1),true);} +var niceMin=Math.floor(dataRange.min/spacing)*spacing;var niceMax=Math.ceil(dataRange.max/spacing)*spacing;if(generationOptions.min&&generationOptions.max&&generationOptions.stepSize){if(helpers.almostWhole((generationOptions.max-generationOptions.min)/generationOptions.stepSize,spacing/1000)){niceMin=generationOptions.min;niceMax=generationOptions.max;}} +var numSpaces=(niceMax-niceMin)/spacing;if(helpers.almostEquals(numSpaces,Math.round(numSpaces),spacing/1000)){numSpaces=Math.round(numSpaces);}else{numSpaces=Math.ceil(numSpaces);} +ticks.push(generationOptions.min!==undefined?generationOptions.min:niceMin);for(var j=1;j3?ticks[2]-ticks[1]:ticks[1]-ticks[0];if(Math.abs(delta)>1){if(tickValue!==Math.floor(tickValue)){delta=tickValue-Math.floor(tickValue);}} +var logDelta=helpers.log10(Math.abs(delta));var tickString='';if(tickValue!==0){var numDecimal=-1*Math.floor(logDelta);numDecimal=Math.max(Math.min(numDecimal,20),0);tickString=tickValue.toFixed(numDecimal);}else{tickString='0';} +return tickString;},logarithmic:function(tickValue,index,ticks){var remain=tickValue/(Math.pow(10,Math.floor(helpers.log10(tickValue))));if(tickValue===0){return'0';}else if(remain===1||remain===2||remain===5||index===0||index===ticks.length-1){return tickValue.toExponential();} +return'';}}};};},{}],34:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;function mergeOpacity(colorString,opacity){var color=helpers.color(colorString);return color.alpha(opacity*color.alpha()).rgbaString();} +Chart.defaults.global.tooltips={enabled:true,custom:null,mode:'nearest',position:'average',intersect:true,backgroundColor:'rgba(0,0,0,0.8)',titleFontStyle:'bold',titleSpacing:2,titleMarginBottom:6,titleFontColor:'#fff',titleAlign:'left',bodySpacing:2,bodyFontColor:'#fff',bodyAlign:'left',footerFontStyle:'bold',footerSpacing:2,footerMarginTop:6,footerFontColor:'#fff',footerAlign:'left',yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:'#fff',displayColors:true,borderColor:'rgba(0,0,0,0)',borderWidth:0,callbacks:{beforeTitle:helpers.noop,title:function(tooltipItems,data){var title='';var labels=data.labels;var labelCount=labels?labels.length:0;if(tooltipItems.length>0){var item=tooltipItems[0];if(item.xLabel){title=item.xLabel;}else if(labelCount>0&&item.index(chart.height-size.height)){yAlign='bottom';} +var lf,rf;var olf,orf;var yf;var midX=(chartArea.left+chartArea.right)/2;var midY=(chartArea.top+chartArea.bottom)/2;if(yAlign==='center'){lf=function(x){return x<=midX;};rf=function(x){return x>midX;};}else{lf=function(x){return x<=(size.width/2);};rf=function(x){return x>=(chart.width-(size.width/2));};} +olf=function(x){return x+size.width>chart.width;};orf=function(x){return x-size.width<0;};yf=function(y){return y<=midY?'top':'bottom';};if(lf(model.x)){xAlign='left';if(olf(model.x)){xAlign='center';yAlign=yf(model.y);}}else if(rf(model.x)){xAlign='right';if(orf(model.x)){xAlign='center';yAlign=yf(model.y);}} +var opts=tooltip._options;return{xAlign:opts.xAlign?opts.xAlign:xAlign,yAlign:opts.yAlign?opts.yAlign:yAlign};} +function getBackgroundPoint(vm,size,alignment){var x=vm.x;var y=vm.y;var caretSize=vm.caretSize,caretPadding=vm.caretPadding,cornerRadius=vm.cornerRadius,xAlign=alignment.xAlign,yAlign=alignment.yAlign,paddingAndSize=caretSize+caretPadding,radiusAndPadding=cornerRadius+caretPadding;if(xAlign==='right'){x-=size.width;}else if(xAlign==='center'){x-=(size.width/2);} +if(yAlign==='top'){y+=paddingAndSize;}else if(yAlign==='bottom'){y-=size.height+paddingAndSize;}else{y-=(size.height/2);} +if(yAlign==='center'){if(xAlign==='left'){x+=paddingAndSize;}else if(xAlign==='right'){x-=paddingAndSize;}}else if(xAlign==='left'){x-=radiusAndPadding;}else if(xAlign==='right'){x+=radiusAndPadding;} +return{x:x,y:y};} +Chart.Tooltip=Chart.Element.extend({initialize:function(){this._model=getBaseModel(this._options);},getTitle:function(){var me=this;var opts=me._options;var callbacks=opts.callbacks;var beforeTitle=callbacks.beforeTitle.apply(me,arguments),title=callbacks.title.apply(me,arguments),afterTitle=callbacks.afterTitle.apply(me,arguments);var lines=[];lines=pushOrConcat(lines,beforeTitle);lines=pushOrConcat(lines,title);lines=pushOrConcat(lines,afterTitle);return lines;},getBeforeBody:function(){var lines=this._options.callbacks.beforeBody.apply(this,arguments);return helpers.isArray(lines)?lines:lines!==undefined?[lines]:[];},getBody:function(tooltipItems,data){var me=this;var callbacks=me._options.callbacks;var bodyItems=[];helpers.each(tooltipItems,function(tooltipItem){var bodyItem={before:[],lines:[],after:[]};pushOrConcat(bodyItem.before,callbacks.beforeLabel.call(me,tooltipItem,data));pushOrConcat(bodyItem.lines,callbacks.label.call(me,tooltipItem,data));pushOrConcat(bodyItem.after,callbacks.afterLabel.call(me,tooltipItem,data));bodyItems.push(bodyItem);});return bodyItems;},getAfterBody:function(){var lines=this._options.callbacks.afterBody.apply(this,arguments);return helpers.isArray(lines)?lines:lines!==undefined?[lines]:[];},getFooter:function(){var me=this;var callbacks=me._options.callbacks;var beforeFooter=callbacks.beforeFooter.apply(me,arguments);var footer=callbacks.footer.apply(me,arguments);var afterFooter=callbacks.afterFooter.apply(me,arguments);var lines=[];lines=pushOrConcat(lines,beforeFooter);lines=pushOrConcat(lines,footer);lines=pushOrConcat(lines,afterFooter);return lines;},update:function(changed){var me=this;var opts=me._options;var existingModel=me._model;var model=me._model=getBaseModel(opts);var active=me._active;var data=me._data;var alignment={xAlign:existingModel.xAlign,yAlign:existingModel.yAlign};var backgroundPoint={x:existingModel.x,y:existingModel.y};var tooltipSize={width:existingModel.width,height:existingModel.height};var tooltipPosition={x:existingModel.caretX,y:existingModel.caretY};var i,len;if(active.length){model.opacity=1;var labelColors=[];tooltipPosition=Chart.Tooltip.positioners[opts.position](active,me._eventPosition);var tooltipItems=[];for(i=0,len=active.length;i0){ctx.stroke();}},draw:function(){var ctx=this._chart.ctx;var vm=this._view;if(vm.opacity===0){return;} +var tooltipSize={width:vm.width,height:vm.height};var pt={x:vm.x,y:vm.y};var opacity=Math.abs(vm.opacity<1e-3)?0:vm.opacity;var hasTooltipContent=vm.title.length||vm.beforeBody.length||vm.body.length||vm.afterBody.length||vm.footer.length;if(this._options.enabled&&hasTooltipContent){this.drawBackground(pt,vm,ctx,tooltipSize,opacity);pt.x+=vm.xPadding;pt.y+=vm.yPadding;this.drawTitle(pt,vm,ctx,opacity);this.drawBody(pt,vm,ctx,opacity);this.drawFooter(pt,vm,ctx,opacity);}},handleEvent:function(e){var me=this;var options=me._options;var changed=false;me._lastActive=me._lastActive||[];if(e.type==='mouseout'){me._active=[];}else{me._active=me._chart.getElementsAtEventForMode(e,options.mode,options);} +changed=!helpers.arrayEquals(me._active,me._lastActive);if(!changed){return false;} +me._lastActive=me._active;if(options.enabled||options.custom){me._eventPosition={x:e.x,y:e.y};var model=me._model;me.update(true);me.pivot();changed|=(model.x!==me._model.x)||(model.y!==me._model.y);} +return changed;}});Chart.Tooltip.positioners={average:function(elements){if(!elements.length){return false;} +var i,len;var x=0;var y=0;var count=0;for(i=0,len=elements.length;iendAngle){angle-=2.0*Math.PI;} +while(angle=startAngle&&angle<=endAngle),withinRadius=(distance>=vm.innerRadius&&distance<=vm.outerRadius);return(betweenAngles&&withinRadius);} +return false;},getCenterPoint:function(){var vm=this._view;var halfAngle=(vm.startAngle+vm.endAngle)/2;var halfRadius=(vm.innerRadius+vm.outerRadius)/2;return{x:vm.x+Math.cos(halfAngle)*halfRadius,y:vm.y+Math.sin(halfAngle)*halfRadius};},getArea:function(){var vm=this._view;return Math.PI*((vm.endAngle-vm.startAngle)/(2*Math.PI))*(Math.pow(vm.outerRadius,2)-Math.pow(vm.innerRadius,2));},tooltipPosition:function(){var vm=this._view;var centreAngle=vm.startAngle+((vm.endAngle-vm.startAngle)/2),rangeFromCentre=(vm.outerRadius-vm.innerRadius)/2+vm.innerRadius;return{x:vm.x+(Math.cos(centreAngle)*rangeFromCentre),y:vm.y+(Math.sin(centreAngle)*rangeFromCentre)};},draw:function(){var ctx=this._chart.ctx,vm=this._view,sA=vm.startAngle,eA=vm.endAngle;ctx.beginPath();ctx.arc(vm.x,vm.y,vm.outerRadius,sA,eA);ctx.arc(vm.x,vm.y,vm.innerRadius,eA,sA,true);ctx.closePath();ctx.strokeStyle=vm.borderColor;ctx.lineWidth=vm.borderWidth;ctx.fillStyle=vm.backgroundColor;ctx.fill();ctx.lineJoin='bevel';if(vm.borderWidth){ctx.stroke();}}});};},{}],36:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;var globalDefaults=Chart.defaults.global;Chart.defaults.global.elements.line={tension:0.4,backgroundColor:globalDefaults.defaultColor,borderWidth:3,borderColor:globalDefaults.defaultColor,borderCapStyle:'butt',borderDash:[],borderDashOffset:0.0,borderJoinStyle:'miter',capBezierPoints:true,fill:true,};Chart.elements.Line=Chart.Element.extend({draw:function(){var me=this;var vm=me._view;var ctx=me._chart.ctx;var spanGaps=vm.spanGaps;var points=me._children.slice();var globalOptionLineElements=globalDefaults.elements.line;var lastDrawnIndex=-1;var index,current,previous,currentVM;if(me._loop&&points.length){points.push(points[0]);} +ctx.save();ctx.lineCap=vm.borderCapStyle||globalOptionLineElements.borderCapStyle;if(ctx.setLineDash){ctx.setLineDash(vm.borderDash||globalOptionLineElements.borderDash);} +ctx.lineDashOffset=vm.borderDashOffset||globalOptionLineElements.borderDashOffset;ctx.lineJoin=vm.borderJoinStyle||globalOptionLineElements.borderJoinStyle;ctx.lineWidth=vm.borderWidth||globalOptionLineElements.borderWidth;ctx.strokeStyle=vm.borderColor||globalDefaults.defaultColor;ctx.beginPath();lastDrawnIndex=-1;for(index=0;indextop?1:-1;borderSkipped=vm.borderSkipped||'bottom';}else{left=vm.base;right=vm.x;top=vm.y-vm.height/2;bottom=vm.y+vm.height/2;signX=right>left?1:-1;signY=1;borderSkipped=vm.borderSkipped||'left';} +if(borderWidth){var barSize=Math.min(Math.abs(left-right),Math.abs(top-bottom));borderWidth=borderWidth>barSize?barSize:borderWidth;var halfStroke=borderWidth/2;var borderLeft=left+(borderSkipped!=='left'?halfStroke*signX:0);var borderRight=right+(borderSkipped!=='right'?-halfStroke*signX:0);var borderTop=top+(borderSkipped!=='top'?halfStroke*signY:0);var borderBottom=bottom+(borderSkipped!=='bottom'?-halfStroke*signY:0);if(borderLeft!==borderRight){top=borderTop;bottom=borderBottom;} +if(borderTop!==borderBottom){left=borderLeft;right=borderRight;}} +ctx.beginPath();ctx.fillStyle=vm.backgroundColor;ctx.strokeStyle=vm.borderColor;ctx.lineWidth=borderWidth;var corners=[[left,bottom],[left,top],[right,top],[right,bottom]];var borders=['bottom','left','top','right'];var startCorner=borders.indexOf(borderSkipped,0);if(startCorner===-1){startCorner=0;} +function cornerAt(index){return corners[(startCorner+index)%4];} +var corner=cornerAt(0);ctx.moveTo(corner[0],corner[1]);for(var i=1;i<4;i++){corner=cornerAt(i);ctx.lineTo(corner[0],corner[1]);} +ctx.fill();if(borderWidth){ctx.stroke();}},height:function(){var vm=this._view;return vm.base-vm.y;},inRange:function(mouseX,mouseY){var inRange=false;if(this._view){var bounds=getBarBounds(this);inRange=mouseX>=bounds.left&&mouseX<=bounds.right&&mouseY>=bounds.top&&mouseY<=bounds.bottom;} +return inRange;},inLabelRange:function(mouseX,mouseY){var me=this;if(!me._view){return false;} +var inRange=false;var bounds=getBarBounds(me);if(isVertical(me)){inRange=mouseX>=bounds.left&&mouseX<=bounds.right;}else{inRange=mouseY>=bounds.top&&mouseY<=bounds.bottom;} +return inRange;},inXRange:function(mouseX){var bounds=getBarBounds(this);return mouseX>=bounds.left&&mouseX<=bounds.right;},inYRange:function(mouseY){var bounds=getBarBounds(this);return mouseY>=bounds.top&&mouseY<=bounds.bottom;},getCenterPoint:function(){var vm=this._view;var x,y;if(isVertical(this)){x=vm.x;y=(vm.y+vm.base)/2;}else{x=(vm.x+vm.base)/2;y=vm.y;} +return{x:x,y:y};},getArea:function(){var vm=this._view;return vm.width*Math.abs(vm.y-vm.base);},tooltipPosition:function(){var vm=this._view;return{x:vm.x,y:vm.y};}});};},{}],39:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;var eventTypeMap={touchstart:'mousedown',touchmove:'mousemove',touchend:'mouseup',pointerenter:'mouseenter',pointerdown:'mousedown',pointermove:'mousemove',pointerup:'mouseup',pointerleave:'mouseout',pointerout:'mouseout'};function readUsedSize(element,property){var value=helpers.getStyle(element,property);var matches=value&&value.match(/^(\d+)(\.\d+)?px$/);return matches?Number(matches[1]):undefined;} +function initCanvas(canvas,config){var style=canvas.style;var renderHeight=canvas.getAttribute('height');var renderWidth=canvas.getAttribute('width');canvas._chartjs={initial:{height:renderHeight,width:renderWidth,style:{display:style.display,height:style.height,width:style.width}}};style.display=style.display||'block';if(renderWidth===null||renderWidth===''){var displayWidth=readUsedSize(canvas,'width');if(displayWidth!==undefined){canvas.width=displayWidth;}} +if(renderHeight===null||renderHeight===''){if(canvas.style.height===''){canvas.height=canvas.width/(config.options.aspectRatio||2);}else{var displayHeight=readUsedSize(canvas,'height');if(displayWidth!==undefined){canvas.height=displayHeight;}}} +return canvas;} +function createEvent(type,chart,x,y,nativeEvent){return{type:type,chart:chart,native:nativeEvent||null,x:x!==undefined?x:null,y:y!==undefined?y:null,};} +function fromNativeEvent(event,chart){var type=eventTypeMap[event.type]||event.type;var pos=helpers.getRelativePosition(event,chart);return createEvent(type,chart,pos.x,pos.y,event);} +function createResizer(handler){var iframe=document.createElement('iframe');iframe.className='chartjs-hidden-iframe';iframe.style.cssText='display:block;'+'overflow:hidden;'+'border:0;'+'margin:0;'+'top:0;'+'left:0;'+'bottom:0;'+'right:0;'+'height:100%;'+'width:100%;'+'position:absolute;'+'pointer-events:none;'+'z-index:-1;';iframe.tabIndex=-1;helpers.addEvent(iframe,'load',function(){helpers.addEvent(iframe.contentWindow||iframe,'resize',handler);handler();});return iframe;} +function addResizeListener(node,listener,chart){var stub=node._chartjs={ticking:false};var notify=function(){if(!stub.ticking){stub.ticking=true;helpers.requestAnimFrame.call(window,function(){if(stub.resizer){stub.ticking=false;return listener(createEvent('resize',chart));}});}};stub.resizer=createResizer(notify);node.insertBefore(stub.resizer,node.firstChild);} +function removeResizeListener(node){if(!node||!node._chartjs){return;} +var resizer=node._chartjs.resizer;if(resizer){resizer.parentNode.removeChild(resizer);node._chartjs.resizer=null;} +delete node._chartjs;} +return{acquireContext:function(item,config){if(typeof item==='string'){item=document.getElementById(item);}else if(item.length){item=item[0];} +if(item&&item.canvas){item=item.canvas;} +var context=item&&item.getContext&&item.getContext('2d');if(context&&context.canvas===item){initCanvas(item,config);return context;} +return null;},releaseContext:function(context){var canvas=context.canvas;if(!canvas._chartjs){return;} +var initial=canvas._chartjs.initial;['height','width'].forEach(function(prop){var value=initial[prop];if(value===undefined||value===null){canvas.removeAttribute(prop);}else{canvas.setAttribute(prop,value);}});helpers.each(initial.style||{},function(value,key){canvas.style[key]=value;});canvas.width=canvas.width;delete canvas._chartjs;},addEventListener:function(chart,type,listener){var canvas=chart.canvas;if(type==='resize'){addResizeListener(canvas.parentNode,listener,chart);return;} +var stub=listener._chartjs||(listener._chartjs={});var proxies=stub.proxies||(stub.proxies={});var proxy=proxies[chart.id+'_'+type]=function(event){listener(fromNativeEvent(event,chart));};helpers.addEvent(canvas,type,proxy);},removeEventListener:function(chart,type,listener){var canvas=chart.canvas;if(type==='resize'){removeResizeListener(canvas.parentNode,listener);return;} +var stub=listener._chartjs||{};var proxies=stub.proxies||{};var proxy=proxies[chart.id+'_'+type];if(!proxy){return;} +helpers.removeEvent(canvas,type,proxy);}};};},{}],40:[function(require,module,exports){'use strict';var implementation=require(39);module.exports=function(Chart){Chart.platform={acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}};Chart.helpers.extend(Chart.platform,implementation(Chart));};},{"39":39}],41:[function(require,module,exports){'use strict';module.exports=function(Chart){Chart.defaults.global.plugins.filler={propagate:true};var defaults=Chart.defaults;var helpers=Chart.helpers;var mappers={dataset:function(source){var index=source.fill;var chart=source.chart;var meta=chart.getDatasetMeta(index);var visible=meta&&chart.isDatasetVisible(index);var points=(visible&&meta.dataset._children)||[];return!points.length?null:function(point,i){return points[i]._view||null;};},boundary:function(source){var boundary=source.boundary;var x=boundary?boundary.x:null;var y=boundary?boundary.y:null;return function(point){return{x:x===null?point.x:x,y:y===null?point.y:y,};};}};function decodeFill(el,index,count){var model=el._model||{};var fill=model.fill;var target;if(fill===undefined){fill=!!model.backgroundColor;} +if(fill===false||fill===null){return false;} +if(fill===true){return'origin';} +target=parseFloat(fill,10);if(isFinite(target)&&Math.floor(target)===target){if(fill[0]==='-'||fill[0]==='+'){target=index+target;} +if(target===index||target<0||target>=count){return false;} +return target;} +switch(fill){case'bottom':return'start';case'top':return'end';case'zero':return'origin';case'origin':case'start':case'end':return fill;default:return false;}} +function computeBoundary(source){var model=source.el._model||{};var scale=source.el._scale||{};var fill=source.fill;var target=null;var horizontal;if(isFinite(fill)){return null;} +if(fill==='start'){target=model.scaleBottom===undefined?scale.bottom:model.scaleBottom;}else if(fill==='end'){target=model.scaleTop===undefined?scale.top:model.scaleTop;}else if(model.scaleZero!==undefined){target=model.scaleZero;}else if(scale.getBasePosition){target=scale.getBasePosition();}else if(scale.getBasePixel){target=scale.getBasePixel();} +if(target!==undefined&&target!==null){if(target.x!==undefined&&target.y!==undefined){return target;} +if(typeof target==='number'&&isFinite(target)){horizontal=scale.isHorizontal();return{x:horizontal?target:null,y:horizontal?null:target};}} +return null;} +function resolveTarget(sources,index,propagate){var source=sources[index];var fill=source.fill;var visited=[index];var target;if(!propagate){return fill;} +while(fill!==false&&visited.indexOf(fill)===-1){if(!isFinite(fill)){return fill;} +target=sources[fill];if(!target){return false;} +if(target.visible){return fill;} +visited.push(fill);fill=target.fill;} +return false;} +function createMapper(source){var fill=source.fill;var type='dataset';if(fill===false){return null;} +if(!isFinite(fill)){type='boundary';} +return mappers[type](source);} +function isDrawable(point){return point&&!point.skip;} +function drawArea(ctx,curve0,curve1,len0,len1){var i;if(!len0||!len1){return;} +ctx.moveTo(curve0[0].x,curve0[0].y);for(i=1;i0;--i){helpers.canvas.lineTo(ctx,curve1[i],curve1[i-1],true);}} +function doFill(ctx,points,mapper,view,color,loop){var count=points.length;var span=view.spanGaps;var curve0=[];var curve1=[];var len0=0;var len1=0;var i,ilen,index,p0,p1,d0,d1;ctx.beginPath();for(i=0,ilen=(count+!!loop);i=me.width){totalHeight+=fontSize+(labelOpts.padding);lineWidths[lineWidths.length]=me.left;} +hitboxes[i]={left:0,top:0,width:width,height:fontSize};lineWidths[lineWidths.length-1]+=width+labelOpts.padding;});minSize.height+=totalHeight;}else{var vPadding=labelOpts.padding;var columnWidths=me.columnWidths=[];var totalWidth=labelOpts.padding;var currentColWidth=0;var currentColHeight=0;var itemHeight=fontSize+vPadding;helpers.each(me.legendItems,function(legendItem,i){var boxWidth=getBoxWidth(labelOpts,fontSize);var itemWidth=boxWidth+(fontSize/2)+ctx.measureText(legendItem.text).width;if(currentColHeight+itemHeight>minSize.height){totalWidth+=currentColWidth+labelOpts.padding;columnWidths.push(currentColWidth);currentColWidth=0;currentColHeight=0;} +currentColWidth=Math.max(currentColWidth,itemWidth);currentColHeight+=itemHeight;hitboxes[i]={left:0,top:0,width:itemWidth,height:fontSize};});totalWidth+=currentColWidth;columnWidths.push(currentColWidth);minSize.width+=totalWidth;}} +me.width=minSize.width;me.height=minSize.height;},afterFit:noop,isHorizontal:function(){return this.options.position==='top'||this.options.position==='bottom';},draw:function(){var me=this;var opts=me.options;var labelOpts=opts.labels;var globalDefault=Chart.defaults.global,lineDefault=globalDefault.elements.line,legendWidth=me.width,lineWidths=me.lineWidths;if(opts.display){var ctx=me.ctx,cursor,itemOrDefault=helpers.getValueOrDefault,fontColor=itemOrDefault(labelOpts.fontColor,globalDefault.defaultFontColor),fontSize=itemOrDefault(labelOpts.fontSize,globalDefault.defaultFontSize),fontStyle=itemOrDefault(labelOpts.fontStyle,globalDefault.defaultFontStyle),fontFamily=itemOrDefault(labelOpts.fontFamily,globalDefault.defaultFontFamily),labelFont=helpers.fontString(fontSize,fontStyle,fontFamily);ctx.textAlign='left';ctx.textBaseline='top';ctx.lineWidth=0.5;ctx.strokeStyle=fontColor;ctx.fillStyle=fontColor;ctx.font=labelFont;var boxWidth=getBoxWidth(labelOpts,fontSize),hitboxes=me.legendHitBoxes;var drawLegendBox=function(x,y,legendItem){if(isNaN(boxWidth)||boxWidth<=0){return;} +ctx.save();ctx.fillStyle=itemOrDefault(legendItem.fillStyle,globalDefault.defaultColor);ctx.lineCap=itemOrDefault(legendItem.lineCap,lineDefault.borderCapStyle);ctx.lineDashOffset=itemOrDefault(legendItem.lineDashOffset,lineDefault.borderDashOffset);ctx.lineJoin=itemOrDefault(legendItem.lineJoin,lineDefault.borderJoinStyle);ctx.lineWidth=itemOrDefault(legendItem.lineWidth,lineDefault.borderWidth);ctx.strokeStyle=itemOrDefault(legendItem.strokeStyle,globalDefault.defaultColor);var isLineWidthZero=(itemOrDefault(legendItem.lineWidth,lineDefault.borderWidth)===0);if(ctx.setLineDash){ctx.setLineDash(itemOrDefault(legendItem.lineDash,lineDefault.borderDash));} +if(opts.labels&&opts.labels.usePointStyle){var radius=fontSize*Math.SQRT2/2;var offSet=radius/Math.SQRT2;var centerX=x+offSet;var centerY=y+offSet;Chart.canvasHelpers.drawPoint(ctx,legendItem.pointStyle,radius,centerX,centerY);}else{if(!isLineWidthZero){ctx.strokeRect(x,y,boxWidth,fontSize);} +ctx.fillRect(x,y,boxWidth,fontSize);} +ctx.restore();};var fillText=function(x,y,legendItem,textWidth){ctx.fillText(legendItem.text,boxWidth+(fontSize/2)+x,y);if(legendItem.hidden){ctx.beginPath();ctx.lineWidth=2;ctx.moveTo(boxWidth+(fontSize/2)+x,y+(fontSize/2));ctx.lineTo(boxWidth+(fontSize/2)+x+textWidth,y+(fontSize/2));ctx.stroke();}};var isHorizontal=me.isHorizontal();if(isHorizontal){cursor={x:me.left+((legendWidth-lineWidths[0])/2),y:me.top+labelOpts.padding,line:0};}else{cursor={x:me.left+labelOpts.padding,y:me.top+labelOpts.padding,line:0};} +var itemHeight=fontSize+labelOpts.padding;helpers.each(me.legendItems,function(legendItem,i){var textWidth=ctx.measureText(legendItem.text).width,width=boxWidth+(fontSize/2)+textWidth,x=cursor.x,y=cursor.y;if(isHorizontal){if(x+width>=legendWidth){y=cursor.y+=itemHeight;cursor.line++;x=cursor.x=me.left+((legendWidth-lineWidths[cursor.line])/2);}}else if(y+itemHeight>me.bottom){x=cursor.x=x+me.columnWidths[cursor.line]+labelOpts.padding;y=cursor.y=me.top+labelOpts.padding;cursor.line++;} +drawLegendBox(x,y,legendItem);hitboxes[i].left=x;hitboxes[i].top=y;fillText(x,y,legendItem,textWidth);if(isHorizontal){cursor.x+=width+(labelOpts.padding);}else{cursor.y+=itemHeight;}});}},handleEvent:function(e){var me=this;var opts=me.options;var type=e.type==='mouseup'?'click':e.type;var changed=false;if(type==='mousemove'){if(!opts.onHover){return;}}else if(type==='click'){if(!opts.onClick){return;}}else{return;} +var x=e.x,y=e.y;if(x>=me.left&&x<=me.right&&y>=me.top&&y<=me.bottom){var lh=me.legendHitBoxes;for(var i=0;i=hitBox.left&&x<=hitBox.left+hitBox.width&&y>=hitBox.top&&y<=hitBox.top+hitBox.height){if(type==='click'){opts.onClick.call(me,e.native,me.legendItems[i]);changed=true;break;}else if(type==='mousemove'){opts.onHover.call(me,e.native,me.legendItems[i]);changed=true;break;}}}} +return changed;}});function createNewLegendAndAttach(chart,legendOpts){var legend=new Chart.Legend({ctx:chart.ctx,options:legendOpts,chart:chart});layout.configure(chart,legend,legendOpts);layout.addBox(chart,legend);chart.legend=legend;} +return{id:'legend',beforeInit:function(chart){var legendOpts=chart.options.legend;if(legendOpts){createNewLegendAndAttach(chart,legendOpts);}},beforeUpdate:function(chart){var legendOpts=chart.options.legend;var legend=chart.legend;if(legendOpts){legendOpts=helpers.configMerge(Chart.defaults.global.legend,legendOpts);if(legend){layout.configure(chart,legend,legendOpts);legend.options=legendOpts;}else{createNewLegendAndAttach(chart,legendOpts);}}else if(legend){layout.removeBox(chart,legend);delete chart.legend;}},afterEvent:function(chart,e){var legend=chart.legend;if(legend){legend.handleEvent(e);}}};};},{}],43:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;var layout=Chart.layoutService;var noop=helpers.noop;Chart.defaults.global.title={display:false,position:'top',fullWidth:true,weight:2000,fontStyle:'bold',padding:10,text:''};Chart.Title=Chart.Element.extend({initialize:function(config){var me=this;helpers.extend(me,config);me.legendHitBoxes=[];},beforeUpdate:noop,update:function(maxWidth,maxHeight,margins){var me=this;me.beforeUpdate();me.maxWidth=maxWidth;me.maxHeight=maxHeight;me.margins=margins;me.beforeSetDimensions();me.setDimensions();me.afterSetDimensions();me.beforeBuildLabels();me.buildLabels();me.afterBuildLabels();me.beforeFit();me.fit();me.afterFit();me.afterUpdate();return me.minSize;},afterUpdate:noop,beforeSetDimensions:noop,setDimensions:function(){var me=this;if(me.isHorizontal()){me.width=me.maxWidth;me.left=0;me.right=me.width;}else{me.height=me.maxHeight;me.top=0;me.bottom=me.height;} +me.paddingLeft=0;me.paddingTop=0;me.paddingRight=0;me.paddingBottom=0;me.minSize={width:0,height:0};},afterSetDimensions:noop,beforeBuildLabels:noop,buildLabels:noop,afterBuildLabels:noop,beforeFit:noop,fit:function(){var me=this,valueOrDefault=helpers.getValueOrDefault,opts=me.options,globalDefaults=Chart.defaults.global,display=opts.display,fontSize=valueOrDefault(opts.fontSize,globalDefaults.defaultFontSize),minSize=me.minSize;if(me.isHorizontal()){minSize.width=me.maxWidth;minSize.height=display?fontSize+(opts.padding*2):0;}else{minSize.width=display?fontSize+(opts.padding*2):0;minSize.height=me.maxHeight;} +me.width=minSize.width;me.height=minSize.height;},afterFit:noop,isHorizontal:function(){var pos=this.options.position;return pos==='top'||pos==='bottom';},draw:function(){var me=this,ctx=me.ctx,valueOrDefault=helpers.getValueOrDefault,opts=me.options,globalDefaults=Chart.defaults.global;if(opts.display){var fontSize=valueOrDefault(opts.fontSize,globalDefaults.defaultFontSize),fontStyle=valueOrDefault(opts.fontStyle,globalDefaults.defaultFontStyle),fontFamily=valueOrDefault(opts.fontFamily,globalDefaults.defaultFontFamily),titleFont=helpers.fontString(fontSize,fontStyle,fontFamily),rotation=0,titleX,titleY,top=me.top,left=me.left,bottom=me.bottom,right=me.right,maxWidth;ctx.fillStyle=valueOrDefault(opts.fontColor,globalDefaults.defaultFontColor);ctx.font=titleFont;if(me.isHorizontal()){titleX=left+((right-left)/2);titleY=top+((bottom-top)/2);maxWidth=right-left;}else{titleX=opts.position==='left'?left+(fontSize/2):right-(fontSize/2);titleY=top+((bottom-top)/2);maxWidth=bottom-top;rotation=Math.PI*(opts.position==='left'?-0.5:0.5);} +ctx.save();ctx.translate(titleX,titleY);ctx.rotate(rotation);ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillText(opts.text,0,0,maxWidth);ctx.restore();}}});function createNewTitleBlockAndAttach(chart,titleOpts){var title=new Chart.Title({ctx:chart.ctx,options:titleOpts,chart:chart});layout.configure(chart,title,titleOpts);layout.addBox(chart,title);chart.titleBlock=title;} +return{id:'title',beforeInit:function(chart){var titleOpts=chart.options.title;if(titleOpts){createNewTitleBlockAndAttach(chart,titleOpts);}},beforeUpdate:function(chart){var titleOpts=chart.options.title;var titleBlock=chart.titleBlock;if(titleOpts){titleOpts=helpers.configMerge(Chart.defaults.global.title,titleOpts);if(titleBlock){layout.configure(chart,titleBlock,titleOpts);titleBlock.options=titleOpts;}else{createNewTitleBlockAndAttach(chart,titleOpts);}}else if(titleBlock){Chart.layoutService.removeBox(chart,titleBlock);delete chart.titleBlock;}}};};},{}],44:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;var defaultConfig={position:'bottom'};var DatasetScale=Chart.Scale.extend({getLabels:function(){var data=this.chart.data;return(this.isHorizontal()?data.xLabels:data.yLabels)||data.labels;},determineDataLimits:function(){var me=this;var labels=me.getLabels();me.minIndex=0;me.maxIndex=labels.length-1;var findIndex;if(me.options.ticks.min!==undefined){findIndex=helpers.indexOf(labels,me.options.ticks.min);me.minIndex=findIndex!==-1?findIndex:me.minIndex;} +if(me.options.ticks.max!==undefined){findIndex=helpers.indexOf(labels,me.options.ticks.max);me.maxIndex=findIndex!==-1?findIndex:me.maxIndex;} +me.min=labels[me.minIndex];me.max=labels[me.maxIndex];},buildTicks:function(){var me=this;var labels=me.getLabels();me.ticks=(me.minIndex===0&&me.maxIndex===labels.length-1)?labels:labels.slice(me.minIndex,me.maxIndex+1);},getLabelForIndex:function(index,datasetIndex){var me=this;var data=me.chart.data;var isHorizontal=me.isHorizontal();if(data.yLabels&&!isHorizontal){return me.getRightValue(data.datasets[datasetIndex].data[index]);} +return me.ticks[index-me.minIndex];},getPixelForValue:function(value,index,datasetIndex,includeOffset){var me=this;var offsetAmt=Math.max((me.maxIndex+1-me.minIndex-((me.options.gridLines.offsetGridLines)?0:1)),1);var valueCategory;if(value!==undefined&&value!==null){valueCategory=me.isHorizontal()?value.x:value.y;} +if(valueCategory!==undefined||(value!==undefined&&isNaN(index))){var labels=me.getLabels();value=valueCategory||value;var idx=labels.indexOf(value);index=idx!==-1?idx:index;} +if(me.isHorizontal()){var valueWidth=me.width/offsetAmt;var widthOffset=(valueWidth*(index-me.minIndex));if(me.options.gridLines.offsetGridLines&&includeOffset||me.maxIndex===me.minIndex&&includeOffset){widthOffset+=(valueWidth/2);} +return me.left+Math.round(widthOffset);} +var valueHeight=me.height/offsetAmt;var heightOffset=(valueHeight*(index-me.minIndex));if(me.options.gridLines.offsetGridLines&&includeOffset){heightOffset+=(valueHeight/2);} +return me.top+Math.round(heightOffset);},getPixelForTick:function(index,includeOffset){return this.getPixelForValue(this.ticks[index],index+this.minIndex,null,includeOffset);},getValueForPixel:function(pixel){var me=this;var value;var offsetAmt=Math.max((me.ticks.length-((me.options.gridLines.offsetGridLines)?0:1)),1);var horz=me.isHorizontal();var valueDimension=(horz?me.width:me.height)/offsetAmt;pixel-=horz?me.left:me.top;if(me.options.gridLines.offsetGridLines){pixel-=(valueDimension/2);} +if(pixel<=0){value=0;}else{value=Math.round(pixel/valueDimension);} +return value;},getBasePixel:function(){return this.bottom;}});Chart.scaleService.registerScaleType('category',DatasetScale,defaultConfig);};},{}],45:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;var defaultConfig={position:'left',ticks:{callback:Chart.Ticks.formatters.linear}};var LinearScale=Chart.LinearScaleBase.extend({determineDataLimits:function(){var me=this;var opts=me.options;var chart=me.chart;var data=chart.data;var datasets=data.datasets;var isHorizontal=me.isHorizontal();var DEFAULT_MIN=0;var DEFAULT_MAX=1;function IDMatches(meta){return isHorizontal?meta.xAxisID===me.id:meta.yAxisID===me.id;} +me.min=null;me.max=null;var hasStacks=opts.stacked;if(hasStacks===undefined){helpers.each(datasets,function(dataset,datasetIndex){if(hasStacks){return;} +var meta=chart.getDatasetMeta(datasetIndex);if(chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)&&meta.stack!==undefined){hasStacks=true;}});} +if(opts.stacked||hasStacks){var valuesPerStack={};helpers.each(datasets,function(dataset,datasetIndex){var meta=chart.getDatasetMeta(datasetIndex);var key=[meta.type,((opts.stacked===undefined&&meta.stack===undefined)?datasetIndex:''),meta.stack].join('.');if(valuesPerStack[key]===undefined){valuesPerStack[key]={positiveValues:[],negativeValues:[]};} +var positiveValues=valuesPerStack[key].positiveValues;var negativeValues=valuesPerStack[key].negativeValues;if(chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)){helpers.each(dataset.data,function(rawValue,index){var value=+me.getRightValue(rawValue);if(isNaN(value)||meta.data[index].hidden){return;} +positiveValues[index]=positiveValues[index]||0;negativeValues[index]=negativeValues[index]||0;if(opts.relativePoints){positiveValues[index]=100;}else if(value<0){negativeValues[index]+=value;}else{positiveValues[index]+=value;}});}});helpers.each(valuesPerStack,function(valuesForType){var values=valuesForType.positiveValues.concat(valuesForType.negativeValues);var minVal=helpers.min(values);var maxVal=helpers.max(values);me.min=me.min===null?minVal:Math.min(me.min,minVal);me.max=me.max===null?maxVal:Math.max(me.max,maxVal);});}else{helpers.each(datasets,function(dataset,datasetIndex){var meta=chart.getDatasetMeta(datasetIndex);if(chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)){helpers.each(dataset.data,function(rawValue,index){var value=+me.getRightValue(rawValue);if(isNaN(value)||meta.data[index].hidden){return;} +if(me.min===null){me.min=value;}else if(valueme.max){me.max=value;}});}});} +me.min=isFinite(me.min)?me.min:DEFAULT_MIN;me.max=isFinite(me.max)?me.max:DEFAULT_MAX;this.handleTickRangeOptions();},getTickLimit:function(){var maxTicks;var me=this;var tickOpts=me.options.ticks;if(me.isHorizontal()){maxTicks=Math.min(tickOpts.maxTicksLimit?tickOpts.maxTicksLimit:11,Math.ceil(me.width/50));}else{var tickFontSize=helpers.getValueOrDefault(tickOpts.fontSize,Chart.defaults.global.defaultFontSize);maxTicks=Math.min(tickOpts.maxTicksLimit?tickOpts.maxTicksLimit:11,Math.ceil(me.height/(2*tickFontSize)));} +return maxTicks;},handleDirectionalChanges:function(){if(!this.isHorizontal()){this.ticks.reverse();}},getLabelForIndex:function(index,datasetIndex){return+this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);},getPixelForValue:function(value){var me=this;var start=me.start;var rightValue=+me.getRightValue(value);var pixel;var range=me.end-start;if(me.isHorizontal()){pixel=me.left+(me.width/range*(rightValue-start));return Math.round(pixel);} +pixel=me.bottom-(me.height/range*(rightValue-start));return Math.round(pixel);},getValueForPixel:function(pixel){var me=this;var isHorizontal=me.isHorizontal();var innerDimension=isHorizontal?me.width:me.height;var offset=(isHorizontal?pixel-me.left:me.bottom-pixel)/innerDimension;return me.start+((me.end-me.start)*offset);},getPixelForTick:function(index){return this.getPixelForValue(this.ticksAsNumbers[index]);}});Chart.scaleService.registerScaleType('linear',LinearScale,defaultConfig);};},{}],46:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers,noop=helpers.noop;Chart.LinearScaleBase=Chart.Scale.extend({handleTickRangeOptions:function(){var me=this;var opts=me.options;var tickOpts=opts.ticks;if(tickOpts.beginAtZero){var minSign=helpers.sign(me.min);var maxSign=helpers.sign(me.max);if(minSign<0&&maxSign<0){me.max=0;}else if(minSign>0&&maxSign>0){me.min=0;}} +if(tickOpts.min!==undefined){me.min=tickOpts.min;}else if(tickOpts.suggestedMin!==undefined){if(me.min===null){me.min=tickOpts.suggestedMin;}else{me.min=Math.min(me.min,tickOpts.suggestedMin);}} +if(tickOpts.max!==undefined){me.max=tickOpts.max;}else if(tickOpts.suggestedMax!==undefined){if(me.max===null){me.max=tickOpts.suggestedMax;}else{me.max=Math.max(me.max,tickOpts.suggestedMax);}} +if(me.min===me.max){me.max++;if(!tickOpts.beginAtZero){me.min--;}}},getTickLimit:noop,handleDirectionalChanges:noop,buildTicks:function(){var me=this;var opts=me.options;var tickOpts=opts.ticks;var maxTicks=me.getTickLimit();maxTicks=Math.max(2,maxTicks);var numericGeneratorOptions={maxTicks:maxTicks,min:tickOpts.min,max:tickOpts.max,stepSize:helpers.getValueOrDefault(tickOpts.fixedStepSize,tickOpts.stepSize)};var ticks=me.ticks=Chart.Ticks.generators.linear(numericGeneratorOptions,me);me.handleDirectionalChanges();me.max=helpers.max(ticks);me.min=helpers.min(ticks);if(tickOpts.reverse){ticks.reverse();me.start=me.max;me.end=me.min;}else{me.start=me.min;me.end=me.max;}},convertTicksToLabels:function(){var me=this;me.ticksAsNumbers=me.ticks.slice();me.zeroLineIndex=me.ticks.indexOf(0);Chart.Scale.prototype.convertTicksToLabels.call(me);}});};},{}],47:[function(require,module,exports){'use strict';module.exports=function(Chart){var helpers=Chart.helpers;var defaultConfig={position:'left',ticks:{callback:Chart.Ticks.formatters.logarithmic}};var LogarithmicScale=Chart.Scale.extend({determineDataLimits:function(){var me=this;var opts=me.options;var tickOpts=opts.ticks;var chart=me.chart;var data=chart.data;var datasets=data.datasets;var getValueOrDefault=helpers.getValueOrDefault;var isHorizontal=me.isHorizontal();function IDMatches(meta){return isHorizontal?meta.xAxisID===me.id:meta.yAxisID===me.id;} +me.min=null;me.max=null;me.minNotZero=null;var hasStacks=opts.stacked;if(hasStacks===undefined){helpers.each(datasets,function(dataset,datasetIndex){if(hasStacks){return;} +var meta=chart.getDatasetMeta(datasetIndex);if(chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)&&meta.stack!==undefined){hasStacks=true;}});} +if(opts.stacked||hasStacks){var valuesPerStack={};helpers.each(datasets,function(dataset,datasetIndex){var meta=chart.getDatasetMeta(datasetIndex);var key=[meta.type,((opts.stacked===undefined&&meta.stack===undefined)?datasetIndex:''),meta.stack].join('.');if(chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)){if(valuesPerStack[key]===undefined){valuesPerStack[key]=[];} +helpers.each(dataset.data,function(rawValue,index){var values=valuesPerStack[key];var value=+me.getRightValue(rawValue);if(isNaN(value)||meta.data[index].hidden){return;} +values[index]=values[index]||0;if(opts.relativePoints){values[index]=100;}else{values[index]+=value;}});}});helpers.each(valuesPerStack,function(valuesForType){var minVal=helpers.min(valuesForType);var maxVal=helpers.max(valuesForType);me.min=me.min===null?minVal:Math.min(me.min,minVal);me.max=me.max===null?maxVal:Math.max(me.max,maxVal);});}else{helpers.each(datasets,function(dataset,datasetIndex){var meta=chart.getDatasetMeta(datasetIndex);if(chart.isDatasetVisible(datasetIndex)&&IDMatches(meta)){helpers.each(dataset.data,function(rawValue,index){var value=+me.getRightValue(rawValue);if(isNaN(value)||meta.data[index].hidden){return;} +if(me.min===null){me.min=value;}else if(valueme.max){me.max=value;} +if(value!==0&&(me.minNotZero===null||valuemax){return{start:pos-size-5,end:pos};} +return{start:pos,end:pos+size+5};} +function fitWithPointLabels(scale){var plFont=getPointLabelFontOptions(scale);var largestPossibleRadius=Math.min(scale.height/2,scale.width/2);var furthestLimits={r:scale.width,l:0,t:scale.height,b:0};var furthestAngles={};var i;var textSize;var pointPosition;scale.ctx.font=plFont.font;scale._pointLabelSizes=[];var valueCount=getValueCount(scale);for(i=0;ifurthestLimits.r){furthestLimits.r=hLimits.end;furthestAngles.r=angleRadians;} +if(vLimits.startfurthestLimits.b){furthestLimits.b=vLimits.end;furthestAngles.b=angleRadians;}} +scale.setReductions(largestPossibleRadius,furthestLimits,furthestAngles);} +function fit(scale){var largestPossibleRadius=Math.min(scale.height/2,scale.width/2);scale.drawingArea=Math.round(largestPossibleRadius);scale.setCenterPoint(0,0,0,0);} +function getTextAlignForAngle(angle){if(angle===0||angle===180){return'center';}else if(angle<180){return'left';} +return'right';} +function fillText(ctx,text,position,fontSize){if(helpers.isArray(text)){var y=position.y;var spacing=1.5*fontSize;for(var i=0;i270||angle<90){position.y-=textSize.h;}} +function drawPointLabels(scale){var ctx=scale.ctx;var getValueOrDefault=helpers.getValueOrDefault;var opts=scale.options;var angleLineOpts=opts.angleLines;var pointLabelOpts=opts.pointLabels;ctx.lineWidth=angleLineOpts.lineWidth;ctx.strokeStyle=angleLineOpts.color;var outerDistance=scale.getDistanceFromCenterForValue(opts.reverse?scale.min:scale.max);var plFont=getPointLabelFontOptions(scale);ctx.textBaseline='top';for(var i=getValueCount(scale)-1;i>=0;i--){if(angleLineOpts.display){var outerPosition=scale.getPointPosition(i,outerDistance);ctx.beginPath();ctx.moveTo(scale.xCenter,scale.yCenter);ctx.lineTo(outerPosition.x,outerPosition.y);ctx.stroke();ctx.closePath();} +if(pointLabelOpts.display){var pointLabelPosition=scale.getPointPosition(i,outerDistance+5);var pointLabelFontColor=getValueOrDefault(pointLabelOpts.fontColor,globalDefaults.defaultFontColor);ctx.font=plFont.font;ctx.fillStyle=pointLabelFontColor;var angleRadians=scale.getIndexAngle(i);var angle=helpers.toDegrees(angleRadians);ctx.textAlign=getTextAlignForAngle(angle);adjustPointPositionForLabelHeight(angle,scale._pointLabelSizes[i],pointLabelPosition);fillText(ctx,scale.pointLabels[i]||'',pointLabelPosition,plFont.size);}}} +function drawRadiusLine(scale,gridLineOpts,radius,index){var ctx=scale.ctx;ctx.strokeStyle=helpers.getValueAtIndexOrDefault(gridLineOpts.color,index-1);ctx.lineWidth=helpers.getValueAtIndexOrDefault(gridLineOpts.lineWidth,index-1);if(scale.options.gridLines.circular){ctx.beginPath();ctx.arc(scale.xCenter,scale.yCenter,radius,0,Math.PI*2);ctx.closePath();ctx.stroke();}else{var valueCount=getValueCount(scale);if(valueCount===0){return;} +ctx.beginPath();var pointPosition=scale.getPointPosition(0,radius);ctx.moveTo(pointPosition.x,pointPosition.y);for(var i=1;i0&&max>0?min:0);},draw:function(){var me=this;var opts=me.options;var gridLineOpts=opts.gridLines;var tickOpts=opts.ticks;var getValueOrDefault=helpers.getValueOrDefault;if(opts.display){var ctx=me.ctx;var tickFontSize=getValueOrDefault(tickOpts.fontSize,globalDefaults.defaultFontSize);var tickFontStyle=getValueOrDefault(tickOpts.fontStyle,globalDefaults.defaultFontStyle);var tickFontFamily=getValueOrDefault(tickOpts.fontFamily,globalDefaults.defaultFontFamily);var tickLabelFont=helpers.fontString(tickFontSize,tickFontStyle,tickFontFamily);helpers.each(me.ticks,function(label,index){if(index>0||opts.reverse){var yCenterOffset=me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);var yHeight=me.yCenter-yCenterOffset;if(gridLineOpts.display&&index!==0){drawRadiusLine(me,gridLineOpts,yCenterOffset,index);} +if(tickOpts.display){var tickFontColor=getValueOrDefault(tickOpts.fontColor,globalDefaults.defaultFontColor);ctx.font=tickLabelFont;if(tickOpts.showLabelBackdrop){var labelWidth=ctx.measureText(label).width;ctx.fillStyle=tickOpts.backdropColor;ctx.fillRect(me.xCenter-labelWidth/2-tickOpts.backdropPaddingX,yHeight-tickFontSize/2-tickOpts.backdropPaddingY,labelWidth+tickOpts.backdropPaddingX*2,tickFontSize+tickOpts.backdropPaddingY*2);} +ctx.textAlign='center';ctx.textBaseline='middle';ctx.fillStyle=tickFontColor;ctx.fillText(label,me.xCenter,yHeight);}}});if(opts.angleLines.display||opts.pointLabels.display){drawPointLabels(me);}}}});Chart.scaleService.registerScaleType('radialLinear',LinearRadialScale,defaultConfig);};},{}],49:[function(require,module,exports){'use strict';var moment=require(6);moment=typeof(moment)==='function'?moment:window.moment;module.exports=function(Chart){var helpers=Chart.helpers;var interval={millisecond:{size:1,steps:[1,2,5,10,20,50,100,250,500]},second:{size:1000,steps:[1,2,5,10,30]},minute:{size:60000,steps:[1,2,5,10,30]},hour:{size:3600000,steps:[1,2,3,6,12]},day:{size:86400000,steps:[1,2,5]},week:{size:604800000,maxStep:4},month:{size:2.628e9,maxStep:3},quarter:{size:7.884e9,maxStep:4},year:{size:3.154e10,maxStep:false}};var defaultConfig={position:'bottom',time:{parser:false,format:false,unit:false,round:false,displayFormat:false,isoWeekday:false,minUnit:'millisecond',displayFormats:{millisecond:'h:mm:ss.SSS a',second:'h:mm:ss a',minute:'h:mm:ss a',hour:'MMM D, hA',day:'ll',week:'ll',month:'MMM YYYY',quarter:'[Q]Q - YYYY',year:'YYYY'},},ticks:{autoSkip:false}};function parseTime(axis,label){var timeOpts=axis.options.time;if(typeof timeOpts.parser==='string'){return moment(label,timeOpts.parser);} +if(typeof timeOpts.parser==='function'){return timeOpts.parser(label);} +if(typeof label.getMonth==='function'||typeof label==='number'){return moment(label);} +if(label.isValid&&label.isValid()){return label;} +var format=timeOpts.format;if(typeof format!=='string'&&format.call){console.warn('options.time.format is deprecated and replaced by options.time.parser.');return format(label);} +return moment(label,format);} +function determineUnit(minUnit,min,max,maxTicks){var units=Object.keys(interval);var unit;var numUnits=units.length;for(var i=units.indexOf(minUnit);imaxTicks;i++){multiplier=unitDefinition.steps[i];sizeInUnits=Math.ceil(range/(unitSizeInMilliSeconds*multiplier));}}else{while(sizeInUnits>maxTicks&&maxTicks>0){++multiplier;sizeInUnits=Math.ceil(range/(unitSizeInMilliSeconds*multiplier));}} +return multiplier;} +function generateTicks(options,dataRange,niceRange){var ticks=[];if(options.maxTicks){var stepSize=options.stepSize;ticks.push(options.min!==undefined?options.min:niceRange.min);var cur=moment(niceRange.min);while(cur.add(stepSize,options.unit).valueOf()0){niceMax.add(1,'week');} +niceMax=niceMax.valueOf();}else{niceMin=moment(dataRange.min).startOf(options.unit).valueOf();niceMax=moment(dataRange.max).startOf(options.unit);if(dataRange.max-niceMax>0){niceMax.add(1,options.unit);} +niceMax=niceMax.valueOf();} +return generateTicks(options,dataRange,{min:niceMin,max:niceMax});};var TimeScale=Chart.Scale.extend({initialize:function(){if(!moment){throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');} +Chart.Scale.prototype.initialize.call(this);},determineDataLimits:function(){var me=this;var timeOpts=me.options.time;var dataMin=Number.MAX_SAFE_INTEGER;var dataMax=Number.MIN_SAFE_INTEGER;var chartData=me.chart.data;var parsedData={labels:[],datasets:[]};var timestamp;helpers.each(chartData.labels,function(label,labelIndex){var labelMoment=parseTime(me,label);if(labelMoment.isValid()){if(timeOpts.round){labelMoment.startOf(timeOpts.round);} +timestamp=labelMoment.valueOf();dataMin=Math.min(timestamp,dataMin);dataMax=Math.max(timestamp,dataMax);parsedData.labels[labelIndex]=timestamp;}});helpers.each(chartData.datasets,function(dataset,datasetIndex){var timestamps=[];if(typeof dataset.data[0]==='object'&&dataset.data[0]!==null&&me.chart.isDatasetVisible(datasetIndex)){helpers.each(dataset.data,function(value,dataIndex){var dataMoment=parseTime(me,me.getRightValue(value));if(dataMoment.isValid()){if(timeOpts.round){dataMoment.startOf(timeOpts.round);} +timestamp=dataMoment.valueOf();dataMin=Math.min(timestamp,dataMin);dataMax=Math.max(timestamp,dataMax);timestamps[dataIndex]=timestamp;}});}else{timestamps=parsedData.labels.slice();} +parsedData.datasets[datasetIndex]=timestamps;});me.dataMin=dataMin;me.dataMax=dataMax;me._parsedData=parsedData;},buildTicks:function(){var me=this;var timeOpts=me.options.time;var minTimestamp;var maxTimestamp;var dataMin=me.dataMin;var dataMax=me.dataMax;if(timeOpts.min){var minMoment=parseTime(me,timeOpts.min);if(timeOpts.round){minMoment.round(timeOpts.round);} +minTimestamp=minMoment.valueOf();} +if(timeOpts.max){maxTimestamp=parseTime(me,timeOpts.max).valueOf();} +var maxTicks=me.getLabelCapacity(minTimestamp||dataMin);var unit=timeOpts.unit||determineUnit(timeOpts.minUnit,minTimestamp||dataMin,maxTimestamp||dataMax,maxTicks);me.displayFormat=timeOpts.displayFormats[unit];var stepSize=timeOpts.stepSize||determineStepSize(minTimestamp||dataMin,maxTimestamp||dataMax,unit,maxTicks);me.ticks=Chart.Ticks.generators.time({maxTicks:maxTicks,min:minTimestamp,max:maxTimestamp,stepSize:stepSize,unit:unit,isoWeekday:timeOpts.isoWeekday},{min:dataMin,max:dataMax});me.max=helpers.max(me.ticks);me.min=helpers.min(me.ticks);},getLabelForIndex:function(index,datasetIndex){var me=this;var label=me.chart.data.labels&&index=1;d--){var i=parseInt(n/t*d);if(o&&(i=parseFloat(n/t*d).toFixed(c)),r)for(;/(\d+)(\d{3})/.test(i.toString());)i=i.toString().replace(/(\d+)(\d{3})/,"$1,$2");a.unshift(i)}e.data("counterup-nums",a),e.text("0");var s=function(){e.text(e.data("counterup-nums").shift()),e.data("counterup-nums").length?setTimeout(e.data("counterup-func"),u.delay):(delete e.data("counterup-nums"),e.data("counterup-nums",null),e.data("counterup-func",null))};e.data("counterup-func",s),setTimeout(e.data("counterup-func"),u.delay)};e.waypoint(a,{offset:"100%",triggerOnce:!0})})}}(jQuery); \ No newline at end of file diff --git a/bassets/counterup/jquery.waypoints.min.js b/bassets/counterup/jquery.waypoints.min.js new file mode 100644 index 0000000..d70b245 --- /dev/null +++ b/bassets/counterup/jquery.waypoints.min.js @@ -0,0 +1,662 @@ +/*! +Waypoints - 4.0.1 +Copyright © 2011-2016 Caleb Troughton +Licensed under the MIT license. +https://github.com/imakewebthings/waypoints/blob/master/licenses.txt +*/ +(function() { + 'use strict' + + var keyCounter = 0 + var allWaypoints = {} + + /* http://imakewebthings.com/waypoints/api/waypoint */ + function Waypoint(options) { + if (!options) { + throw new Error('No options passed to Waypoint constructor') + } + if (!options.element) { + throw new Error('No element option passed to Waypoint constructor') + } + if (!options.handler) { + throw new Error('No handler option passed to Waypoint constructor') + } + + this.key = 'waypoint-' + keyCounter + this.options = Waypoint.Adapter.extend({}, Waypoint.defaults, options) + this.element = this.options.element + this.adapter = new Waypoint.Adapter(this.element) + this.callback = options.handler + this.axis = this.options.horizontal ? 'horizontal' : 'vertical' + this.enabled = this.options.enabled + this.triggerPoint = null + this.group = Waypoint.Group.findOrCreate({ + name: this.options.group, + axis: this.axis + }) + this.context = Waypoint.Context.findOrCreateByElement(this.options.context) + + if (Waypoint.offsetAliases[this.options.offset]) { + this.options.offset = Waypoint.offsetAliases[this.options.offset] + } + this.group.add(this) + this.context.add(this) + allWaypoints[this.key] = this + keyCounter += 1 + } + + /* Private */ + Waypoint.prototype.queueTrigger = function(direction) { + this.group.queueTrigger(this, direction) + } + + /* Private */ + Waypoint.prototype.trigger = function(args) { + if (!this.enabled) { + return + } + if (this.callback) { + this.callback.apply(this, args) + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/destroy */ + Waypoint.prototype.destroy = function() { + this.context.remove(this) + this.group.remove(this) + delete allWaypoints[this.key] + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/disable */ + Waypoint.prototype.disable = function() { + this.enabled = false + return this + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/enable */ + Waypoint.prototype.enable = function() { + this.context.refresh() + this.enabled = true + return this + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/next */ + Waypoint.prototype.next = function() { + return this.group.next(this) + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/previous */ + Waypoint.prototype.previous = function() { + return this.group.previous(this) + } + + /* Private */ + Waypoint.invokeAll = function(method) { + var allWaypointsArray = [] + for (var waypointKey in allWaypoints) { + allWaypointsArray.push(allWaypoints[waypointKey]) + } + for (var i = 0, end = allWaypointsArray.length; i < end; i++) { + allWaypointsArray[i][method]() + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/destroy-all */ + Waypoint.destroyAll = function() { + Waypoint.invokeAll('destroy') + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/disable-all */ + Waypoint.disableAll = function() { + Waypoint.invokeAll('disable') + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/enable-all */ + Waypoint.enableAll = function() { + Waypoint.Context.refreshAll() + for (var waypointKey in allWaypoints) { + allWaypoints[waypointKey].enabled = true + } + return this + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/refresh-all */ + Waypoint.refreshAll = function() { + Waypoint.Context.refreshAll() + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/viewport-height */ + Waypoint.viewportHeight = function() { + return window.innerHeight || document.documentElement.clientHeight + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/viewport-width */ + Waypoint.viewportWidth = function() { + return document.documentElement.clientWidth + } + + Waypoint.adapters = [] + + Waypoint.defaults = { + context: window, + continuous: true, + enabled: true, + group: 'default', + horizontal: false, + offset: 0 + } + + Waypoint.offsetAliases = { + 'bottom-in-view': function() { + return this.context.innerHeight() - this.adapter.outerHeight() + }, + 'right-in-view': function() { + return this.context.innerWidth() - this.adapter.outerWidth() + } + } + + window.Waypoint = Waypoint +}()) +;(function() { + 'use strict' + + function requestAnimationFrameShim(callback) { + window.setTimeout(callback, 1000 / 60) + } + + var keyCounter = 0 + var contexts = {} + var Waypoint = window.Waypoint + var oldWindowLoad = window.onload + + /* http://imakewebthings.com/waypoints/api/context */ + function Context(element) { + this.element = element + this.Adapter = Waypoint.Adapter + this.adapter = new this.Adapter(element) + this.key = 'waypoint-context-' + keyCounter + this.didScroll = false + this.didResize = false + this.oldScroll = { + x: this.adapter.scrollLeft(), + y: this.adapter.scrollTop() + } + this.waypoints = { + vertical: {}, + horizontal: {} + } + + element.waypointContextKey = this.key + contexts[element.waypointContextKey] = this + keyCounter += 1 + if (!Waypoint.windowContext) { + Waypoint.windowContext = true + Waypoint.windowContext = new Context(window) + } + + this.createThrottledScrollHandler() + this.createThrottledResizeHandler() + } + + /* Private */ + Context.prototype.add = function(waypoint) { + var axis = waypoint.options.horizontal ? 'horizontal' : 'vertical' + this.waypoints[axis][waypoint.key] = waypoint + this.refresh() + } + + /* Private */ + Context.prototype.checkEmpty = function() { + var horizontalEmpty = this.Adapter.isEmptyObject(this.waypoints.horizontal) + var verticalEmpty = this.Adapter.isEmptyObject(this.waypoints.vertical) + var isWindow = this.element == this.element.window + if (horizontalEmpty && verticalEmpty && !isWindow) { + this.adapter.off('.waypoints') + delete contexts[this.key] + } + } + + /* Private */ + Context.prototype.createThrottledResizeHandler = function() { + var self = this + + function resizeHandler() { + self.handleResize() + self.didResize = false + } + + this.adapter.on('resize.waypoints', function() { + if (!self.didResize) { + self.didResize = true + Waypoint.requestAnimationFrame(resizeHandler) + } + }) + } + + /* Private */ + Context.prototype.createThrottledScrollHandler = function() { + var self = this + function scrollHandler() { + self.handleScroll() + self.didScroll = false + } + + this.adapter.on('scroll.waypoints', function() { + if (!self.didScroll || Waypoint.isTouch) { + self.didScroll = true + Waypoint.requestAnimationFrame(scrollHandler) + } + }) + } + + /* Private */ + Context.prototype.handleResize = function() { + Waypoint.Context.refreshAll() + } + + /* Private */ + Context.prototype.handleScroll = function() { + var triggeredGroups = {} + var axes = { + horizontal: { + newScroll: this.adapter.scrollLeft(), + oldScroll: this.oldScroll.x, + forward: 'right', + backward: 'left' + }, + vertical: { + newScroll: this.adapter.scrollTop(), + oldScroll: this.oldScroll.y, + forward: 'down', + backward: 'up' + } + } + + for (var axisKey in axes) { + var axis = axes[axisKey] + var isForward = axis.newScroll > axis.oldScroll + var direction = isForward ? axis.forward : axis.backward + + for (var waypointKey in this.waypoints[axisKey]) { + var waypoint = this.waypoints[axisKey][waypointKey] + if (waypoint.triggerPoint === null) { + continue + } + var wasBeforeTriggerPoint = axis.oldScroll < waypoint.triggerPoint + var nowAfterTriggerPoint = axis.newScroll >= waypoint.triggerPoint + var crossedForward = wasBeforeTriggerPoint && nowAfterTriggerPoint + var crossedBackward = !wasBeforeTriggerPoint && !nowAfterTriggerPoint + if (crossedForward || crossedBackward) { + waypoint.queueTrigger(direction) + triggeredGroups[waypoint.group.id] = waypoint.group + } + } + } + + for (var groupKey in triggeredGroups) { + triggeredGroups[groupKey].flushTriggers() + } + + this.oldScroll = { + x: axes.horizontal.newScroll, + y: axes.vertical.newScroll + } + } + + /* Private */ + Context.prototype.innerHeight = function() { + /*eslint-disable eqeqeq */ + if (this.element == this.element.window) { + return Waypoint.viewportHeight() + } + /*eslint-enable eqeqeq */ + return this.adapter.innerHeight() + } + + /* Private */ + Context.prototype.remove = function(waypoint) { + delete this.waypoints[waypoint.axis][waypoint.key] + this.checkEmpty() + } + + /* Private */ + Context.prototype.innerWidth = function() { + /*eslint-disable eqeqeq */ + if (this.element == this.element.window) { + return Waypoint.viewportWidth() + } + /*eslint-enable eqeqeq */ + return this.adapter.innerWidth() + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/context-destroy */ + Context.prototype.destroy = function() { + var allWaypoints = [] + for (var axis in this.waypoints) { + for (var waypointKey in this.waypoints[axis]) { + allWaypoints.push(this.waypoints[axis][waypointKey]) + } + } + for (var i = 0, end = allWaypoints.length; i < end; i++) { + allWaypoints[i].destroy() + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/context-refresh */ + Context.prototype.refresh = function() { + /*eslint-disable eqeqeq */ + var isWindow = this.element == this.element.window + /*eslint-enable eqeqeq */ + var contextOffset = isWindow ? undefined : this.adapter.offset() + var triggeredGroups = {} + var axes + + this.handleScroll() + axes = { + horizontal: { + contextOffset: isWindow ? 0 : contextOffset.left, + contextScroll: isWindow ? 0 : this.oldScroll.x, + contextDimension: this.innerWidth(), + oldScroll: this.oldScroll.x, + forward: 'right', + backward: 'left', + offsetProp: 'left' + }, + vertical: { + contextOffset: isWindow ? 0 : contextOffset.top, + contextScroll: isWindow ? 0 : this.oldScroll.y, + contextDimension: this.innerHeight(), + oldScroll: this.oldScroll.y, + forward: 'down', + backward: 'up', + offsetProp: 'top' + } + } + + for (var axisKey in axes) { + var axis = axes[axisKey] + for (var waypointKey in this.waypoints[axisKey]) { + var waypoint = this.waypoints[axisKey][waypointKey] + var adjustment = waypoint.options.offset + var oldTriggerPoint = waypoint.triggerPoint + var elementOffset = 0 + var freshWaypoint = oldTriggerPoint == null + var contextModifier, wasBeforeScroll, nowAfterScroll + var triggeredBackward, triggeredForward + + if (waypoint.element !== waypoint.element.window) { + elementOffset = waypoint.adapter.offset()[axis.offsetProp] + } + + if (typeof adjustment === 'function') { + adjustment = adjustment.apply(waypoint) + } + else if (typeof adjustment === 'string') { + adjustment = parseFloat(adjustment) + if (waypoint.options.offset.indexOf('%') > - 1) { + adjustment = Math.ceil(axis.contextDimension * adjustment / 100) + } + } + + contextModifier = axis.contextScroll - axis.contextOffset + waypoint.triggerPoint = Math.floor(elementOffset + contextModifier - adjustment) + wasBeforeScroll = oldTriggerPoint < axis.oldScroll + nowAfterScroll = waypoint.triggerPoint >= axis.oldScroll + triggeredBackward = wasBeforeScroll && nowAfterScroll + triggeredForward = !wasBeforeScroll && !nowAfterScroll + + if (!freshWaypoint && triggeredBackward) { + waypoint.queueTrigger(axis.backward) + triggeredGroups[waypoint.group.id] = waypoint.group + } + else if (!freshWaypoint && triggeredForward) { + waypoint.queueTrigger(axis.forward) + triggeredGroups[waypoint.group.id] = waypoint.group + } + else if (freshWaypoint && axis.oldScroll >= waypoint.triggerPoint) { + waypoint.queueTrigger(axis.forward) + triggeredGroups[waypoint.group.id] = waypoint.group + } + } + } + + Waypoint.requestAnimationFrame(function() { + for (var groupKey in triggeredGroups) { + triggeredGroups[groupKey].flushTriggers() + } + }) + + return this + } + + /* Private */ + Context.findOrCreateByElement = function(element) { + return Context.findByElement(element) || new Context(element) + } + + /* Private */ + Context.refreshAll = function() { + for (var contextId in contexts) { + contexts[contextId].refresh() + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/context-find-by-element */ + Context.findByElement = function(element) { + return contexts[element.waypointContextKey] + } + + window.onload = function() { + if (oldWindowLoad) { + oldWindowLoad() + } + Context.refreshAll() + } + + + Waypoint.requestAnimationFrame = function(callback) { + var requestFn = window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + requestAnimationFrameShim + requestFn.call(window, callback) + } + Waypoint.Context = Context +}()) +;(function() { + 'use strict' + + function byTriggerPoint(a, b) { + return a.triggerPoint - b.triggerPoint + } + + function byReverseTriggerPoint(a, b) { + return b.triggerPoint - a.triggerPoint + } + + var groups = { + vertical: {}, + horizontal: {} + } + var Waypoint = window.Waypoint + + /* http://imakewebthings.com/waypoints/api/group */ + function Group(options) { + this.name = options.name + this.axis = options.axis + this.id = this.name + '-' + this.axis + this.waypoints = [] + this.clearTriggerQueues() + groups[this.axis][this.name] = this + } + + /* Private */ + Group.prototype.add = function(waypoint) { + this.waypoints.push(waypoint) + } + + /* Private */ + Group.prototype.clearTriggerQueues = function() { + this.triggerQueues = { + up: [], + down: [], + left: [], + right: [] + } + } + + /* Private */ + Group.prototype.flushTriggers = function() { + for (var direction in this.triggerQueues) { + var waypoints = this.triggerQueues[direction] + var reverse = direction === 'up' || direction === 'left' + waypoints.sort(reverse ? byReverseTriggerPoint : byTriggerPoint) + for (var i = 0, end = waypoints.length; i < end; i += 1) { + var waypoint = waypoints[i] + if (waypoint.options.continuous || i === waypoints.length - 1) { + waypoint.trigger([direction]) + } + } + } + this.clearTriggerQueues() + } + + /* Private */ + Group.prototype.next = function(waypoint) { + this.waypoints.sort(byTriggerPoint) + var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) + var isLast = index === this.waypoints.length - 1 + return isLast ? null : this.waypoints[index + 1] + } + + /* Private */ + Group.prototype.previous = function(waypoint) { + this.waypoints.sort(byTriggerPoint) + var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) + return index ? this.waypoints[index - 1] : null + } + + /* Private */ + Group.prototype.queueTrigger = function(waypoint, direction) { + this.triggerQueues[direction].push(waypoint) + } + + /* Private */ + Group.prototype.remove = function(waypoint) { + var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) + if (index > -1) { + this.waypoints.splice(index, 1) + } + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/first */ + Group.prototype.first = function() { + return this.waypoints[0] + } + + /* Public */ + /* http://imakewebthings.com/waypoints/api/last */ + Group.prototype.last = function() { + return this.waypoints[this.waypoints.length - 1] + } + + /* Private */ + Group.findOrCreate = function(options) { + return groups[options.axis][options.name] || new Group(options) + } + + Waypoint.Group = Group +}()) +;(function() { + 'use strict' + + var $ = window.jQuery + var Waypoint = window.Waypoint + + function JQueryAdapter(element) { + this.$element = $(element) + } + + $.each([ + 'innerHeight', + 'innerWidth', + 'off', + 'offset', + 'on', + 'outerHeight', + 'outerWidth', + 'scrollLeft', + 'scrollTop' + ], function(i, method) { + JQueryAdapter.prototype[method] = function() { + var args = Array.prototype.slice.call(arguments) + return this.$element[method].apply(this.$element, args) + } + }) + + $.each([ + 'extend', + 'inArray', + 'isEmptyObject' + ], function(i, method) { + JQueryAdapter[method] = $[method] + }) + + Waypoint.adapters.push({ + name: 'jquery', + Adapter: JQueryAdapter + }) + Waypoint.Adapter = JQueryAdapter +}()) +;(function() { + 'use strict' + + var Waypoint = window.Waypoint + + function createExtension(framework) { + return function() { + var waypoints = [] + var overrides = arguments[0] + + if (framework.isFunction(arguments[0])) { + overrides = framework.extend({}, arguments[1]) + overrides.handler = arguments[0] + } + + this.each(function() { + var options = framework.extend({}, overrides, { + element: this + }) + if (typeof options.context === 'string') { + options.context = framework(this).closest(options.context)[0] + } + waypoints.push(new Waypoint(options)) + }) + + return waypoints + } + } + + if (window.jQuery) { + window.jQuery.fn.waypoint = createExtension(window.jQuery) + } + if (window.Zepto) { + window.Zepto.fn.waypoint = createExtension(window.Zepto) + } +}()) +; \ No newline at end of file diff --git a/bassets/datatables/export/buttons.dataTables.min.css b/bassets/datatables/export/buttons.dataTables.min.css new file mode 100644 index 0000000..d827587 --- /dev/null +++ b/bassets/datatables/export/buttons.dataTables.min.css @@ -0,0 +1 @@ +@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;margin-bottom:0.333em;padding:0.5em 1em;border:1px solid #999;border-radius:2px;cursor:pointer;font-size:0.88em;line-height:1.6em;color:black;white-space:nowrap;overflow:hidden;background-color:#e9e9e9;background-image:-webkit-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:-o-linear-gradient(top, #fff 0%, #e9e9e9 100%);background-image:linear-gradient(to bottom, #fff 0%, #e9e9e9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9');-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none}button.dt-button.disabled,div.dt-button.disabled,a.dt-button.disabled{color:#999;border:1px solid #d0d0d0;cursor:default;background-color:#f9f9f9;background-image:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #f9f9f9 100%);background-image:linear-gradient(to bottom, #fff 0%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}button.dt-button:active:not(.disabled),button.dt-button.active:not(.disabled),div.dt-button:active:not(.disabled),div.dt-button.active:not(.disabled),a.dt-button:active:not(.disabled),a.dt-button.active:not(.disabled){background-color:#e2e2e2;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%);background-image:linear-gradient(to bottom, #f3f3f3 0%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2');box-shadow:inset 1px 1px 3px #999999}button.dt-button:active:not(.disabled):hover:not(.disabled),button.dt-button.active:not(.disabled):hover:not(.disabled),div.dt-button:active:not(.disabled):hover:not(.disabled),div.dt-button.active:not(.disabled):hover:not(.disabled),a.dt-button:active:not(.disabled):hover:not(.disabled),a.dt-button.active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999999;background-color:#cccccc;background-image:-webkit-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-moz-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-ms-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:-o-linear-gradient(top, #eaeaea 0%, #ccc 100%);background-image:linear-gradient(to bottom, #eaeaea 0%, #ccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc')}button.dt-button:hover,div.dt-button:hover,a.dt-button:hover{text-decoration:none}button.dt-button:hover:not(.disabled),div.dt-button:hover:not(.disabled),a.dt-button:hover:not(.disabled){border:1px solid #666;background-color:#e0e0e0;background-image:-webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:-o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%);background-image:linear-gradient(to bottom, #f9f9f9 0%, #e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0')}button.dt-button:focus:not(.disabled),div.dt-button:focus:not(.disabled),a.dt-button:focus:not(.disabled){border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#79ace9;background-image:-webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-moz-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-ms-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:-o-linear-gradient(top, #bddef4 0%, #79ace9 100%);background-image:linear-gradient(to bottom, #bddef4 0%, #79ace9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9')}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0,0,0,0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear} \ No newline at end of file diff --git a/bassets/datatables/export/buttons.flash.min.js b/bassets/datatables/export/buttons.flash.min.js new file mode 100644 index 0000000..d3c8c0e --- /dev/null +++ b/bassets/datatables/export/buttons.flash.min.js @@ -0,0 +1,32 @@ +(function(g){"function"===typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(k){return g(k,window,document)}):"object"===typeof exports?module.exports=function(k,l){k||(k=window);if(!l||!l.fn.dataTable)l=require("datatables.net")(k,l).$;l.fn.dataTable.Buttons||require("datatables.net-buttons")(k,l);return g(l,k,k.document)}:g(jQuery,window,document)})(function(g,k,l,q){function w(a){for(var b="";0<=a;)b=String.fromCharCode(a%26+65)+b,a=Math.floor(a/26)- +1;return b}function o(a,b,d){var c=a.createElement(b);d&&(d.attr&&g(c).attr(d.attr),d.children&&g.each(d.children,function(a,b){c.appendChild(b)}),null!==d.text&&d.text!==q&&c.appendChild(a.createTextNode(d.text)));return c}function C(a,b){var d=a.header[b].length,c;a.footer&&a.footer[b].length>d&&(d=a.footer[b].length);for(var e=0,f=a.body.length;ed&&(d=c),40'+c),c=c.replace(/_dt_b_namespace_token_/g,":"));c=c.replace(/<([^<>]*?) xmlns=""([^<>]*?)>/g,"<$1 $2>");a[b]=c}})}var j=g.fn.dataTable,h={version:"1.0.4-TableTools2",clients:{},moviePath:"",nextId:1,$:function(a){"string"==typeof a&&(a=l.getElementById(a));a.addClass||(a.hide=function(){this.style.display="none"},a.show=function(){this.style.display= +""},a.addClass=function(a){this.removeClass(a);this.className+=" "+a},a.removeClass=function(a){this.className=this.className.replace(RegExp("\\s*"+a+"\\s*")," ").replace(/^\s+/,"").replace(/\s+$/,"")},a.hasClass=function(a){return!!this.className.match(RegExp("\\s*"+a+"\\s*"))});return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(a,b,d){(a=this.clients[a])&&a.receiveEvent(b,d)},log:function(a){console.log("Flash: "+a)},register:function(a,b){this.clients[a]=b},getDOMObjectPosition:function(a){var b= +{left:0,top:0,width:a.width?a.width:a.offsetWidth,height:a.height?a.height:a.offsetHeight};""!==a.style.width&&(b.width=a.style.width.replace("px",""));""!==a.style.height&&(b.height=a.style.height.replace("px",""));for(;a;)b.left+=a.offsetLeft,b.top+=a.offsetTop,a=a.offsetParent;return b},Client:function(a){this.handlers={};this.id=h.nextId++;this.movieId="ZeroClipboard_TableToolsMovie_"+this.id;h.register(this.id,this);a&&this.glue(a)}};h.Client.prototype={id:0,ready:!1,movie:null,clipText:"",fileName:"", +action:"copy",handCursorEnabled:!0,cssEffects:!0,handlers:null,sized:!1,sheetName:"",glue:function(a,b){this.domElement=h.$(a);var d=99;this.domElement.style.zIndex&&(d=parseInt(this.domElement.style.zIndex,10)+1);var c=h.getDOMObjectPosition(this.domElement);this.div=l.createElement("div");var e=this.div.style;e.position="absolute";e.left="0px";e.top="0px";e.width=c.width+"px";e.height=c.height+"px";e.zIndex=d;"undefined"!=typeof b&&""!==b&&(this.div.title=b);0!==c.width&&0!==c.height&&(this.sized= +!0);this.domElement&&(this.domElement.appendChild(this.div),this.div.innerHTML=this.getHTML(c.width,c.height).replace(/&/g,"&"))},positionElement:function(){var a=h.getDOMObjectPosition(this.domElement),b=this.div.style;b.position="absolute";b.width=a.width+"px";b.height=a.height+"px";0!==a.width&&0!==a.height&&(this.sized=!0,b=this.div.childNodes[0],b.width=a.width,b.height=a.height)},getHTML:function(a,b){var d="",c="id="+this.id+"&width="+a+"&height="+b;if(navigator.userAgent.match(/MSIE/))var e= +location.href.match(/^https/i)?"https://":"http://",d=d+('');else d+='';return d},hide:function(){this.div&&(this.div.style.left="-2000px")}, +show:function(){this.reposition()},destroy:function(){var a=this;this.domElement&&this.div&&(g(this.div).remove(),this.div=this.domElement=null,g.each(h.clients,function(b,d){d===a&&delete h.clients[b]}))},reposition:function(a){a&&((this.domElement=h.$(a))||this.hide());if(this.domElement&&this.div){var a=h.getDOMObjectPosition(this.domElement),b=this.div.style;b.left=""+a.left+"px";b.top=""+a.top+"px"}},clearText:function(){this.clipText="";this.ready&&this.movie.clearText()},appendText:function(a){this.clipText+= +a;this.ready&&this.movie.appendText(a)},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},setFileName:function(a){this.fileName=a;this.ready&&this.movie.setFileName(a)},setSheetData:function(a){this.ready&&this.movie.setSheetData(JSON.stringify(a))},setAction:function(a){this.action=a;this.ready&&this.movie.setAction(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled= +a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){var d,a=a.toString().toLowerCase().replace(/^on/,"");switch(a){case "load":this.movie=l.getElementById(this.movieId);if(!this.movie){d=this;setTimeout(function(){d.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){d=this;setTimeout(function(){d.receiveEvent("load",null)},100);this.ready=!0;return}this.ready= +!0;this.movie.clearText();this.movie.appendText(this.clipText);this.movie.setFileName(this.fileName);this.movie.setAction(this.action);this.movie.setHandCursor(this.handCursorEnabled);break;case "mouseover":this.domElement&&this.cssEffects&&this.recoverActive&&this.domElement.addClass("active");break;case "mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0));break;case "mousedown":this.domElement&& +this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[a])for(var c=0,e=this.handlers[a].length;c',"xl/_rels/workbook.xml.rels":'', +"[Content_Types].xml":'', +"xl/workbook.xml":'', +"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''}, +B=[{match:/^\-?\d+\.\d%$/,style:60,fmt:function(a){return a/100}},{match:/^\-?\d+\.?\d*%$/,style:56,fmt:function(a){return a/100}},{match:/^\-?\$[\d,]+.?\d*$/,style:57},{match:/^\-?£[\d,]+.?\d*$/,style:58},{match:/^\-?€[\d,]+.?\d*$/,style:59},{match:/^\([\d,]+\)$/,style:61,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\([\d,]+\.\d{2}\)$/,style:62,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^[\d,]+$/,style:63},{match:/^[\d,]+\.\d{2}$/,style:64}];j.Buttons.swfPath="//cdn.datatables.net/buttons/"+ +j.Buttons.version+"/swf/flashExport.swf";j.Api.register("buttons.resize()",function(){g.each(h.clients,function(a,b){b.domElement!==q&&b.domElement.parentNode&&b.positionElement()})});j.ext.buttons.copyFlash=g.extend({},u,{className:"buttons-copy buttons-flash",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,d,c){if(c._fromFlash){this.processing(!0);var a=c._flash,e=A(b,c),d=b.buttons.exportInfo(c),f=z(c),e=e.str;d.title&&(e=d.title+f+f+e);d.messageTop&&(e=d.messageTop+ +f+f+e);d.messageBottom&&(e=e+f+f+d.messageBottom);c.customize&&(e=c.customize(e,c,b));a.setAction("copy");t(a,e);this.processing(!1);b.buttons.info(b.i18n("buttons.copyTitle","Copy to clipboard"),b.i18n("buttons.copySuccess",{_:"Copied %d rows to clipboard",1:"Copied 1 row to clipboard"},data.rows),3E3)}},fieldSeparator:"\t",fieldBoundary:""});j.ext.buttons.csvFlash=g.extend({},u,{className:"buttons-csv buttons-flash",text:function(a){return a.i18n("buttons.csv","CSV")},action:function(a,b,d,c){var a= +c._flash,e=A(b,c),d=b.buttons.exportInfo(c),b=c.customize?c.customize(e.str,c,b):e.str;a.setAction("csv");a.setFileName(d.filename);t(a,b)},escapeChar:'"'});j.ext.buttons.excelFlash=g.extend({},u,{className:"buttons-excel buttons-flash",text:function(a){return a.i18n("buttons.excel","Excel")},action:function(a,b,d,c){this.processing(!0);var a=c._flash,e=0,f=g.parseXML(n["xl/worksheets/sheet1.xml"]),h=f.getElementsByTagName("sheetData")[0],d={_rels:{".rels":g.parseXML(n["_rels/.rels"])},xl:{_rels:{"workbook.xml.rels":g.parseXML(n["xl/_rels/workbook.xml.rels"])}, +"workbook.xml":g.parseXML(n["xl/workbook.xml"]),"styles.xml":g.parseXML(n["xl/styles.xml"]),worksheets:{"sheet1.xml":f}},"[Content_Types].xml":g.parseXML(n["[Content_Types].xml"])},i=b.buttons.exportData(c.exportOptions),k,l,j=function(a){k=e+1;l=o(f,"row",{attr:{r:k}});for(var b=0,d=a.length;b'+b),b=b.replace(/_dt_b_namespace_token_/g,":"));b=b.replace(/<([^<>]*?) xmlns=""([^<>]*?)>/g,"<$1 $2>");a.file(d,b)}})}function q(a,b,d){var c=a.createElement(b);d&&(d.attr&&i(c).attr(d.attr),d.children&&i.each(d.children,function(a,b){c.appendChild(b)}),null!==d.text&&d.text!==s&&c.appendChild(a.createTextNode(d.text)));return c}function K(a,b){var d= +a.header[b].length,c;a.footer&&a.footer[b].length>d&&(d=a.footer[b].length);for(var f=0,g=a.body.length;fd&&(d=c),401*a[1]?!0:!1};try{var y=new XMLSerializer,w}catch(P){}var B={"_rels/.rels":'',"xl/_rels/workbook.xml.rels":'', +"[Content_Types].xml":'', +"xl/workbook.xml":'', +"xl/worksheets/sheet1.xml":'',"xl/styles.xml":''}, +J=[{match:/^\-?\d+\.\d%$/,style:60,fmt:function(a){return a/100}},{match:/^\-?\d+\.?\d*%$/,style:56,fmt:function(a){return a/100}},{match:/^\-?\$[\d,]+.?\d*$/,style:57},{match:/^\-?£[\d,]+.?\d*$/,style:58},{match:/^\-?€[\d,]+.?\d*$/,style:59},{match:/^\-?\d+$/,style:65},{match:/^\-?\d+\.\d{2}$/,style:66},{match:/^\([\d,]+\)$/,style:61,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\([\d,]+\.\d{2}\)$/,style:62,fmt:function(a){return-1*a.replace(/[\(\)]/g,"")}},{match:/^\-?[\d,]+$/,style:63}, +{match:/^\-?[\d,]+\.\d{2}$/,style:64}];o.ext.buttons.copyHtml5={className:"buttons-copy buttons-html5",text:function(a){return a.i18n("buttons.copy","Copy")},action:function(a,b,d,c){this.processing(!0);var f=this,a=H(b,c),g=b.buttons.exportInfo(c),e=G(c),n=a.str,d=i("
").css({height:1,width:1,overflow:"hidden",position:"fixed",top:0,left:0});g.title&&(n=g.title+e+e+n);g.messageTop&&(n=g.messageTop+e+e+n);g.messageBottom&&(n=n+e+e+g.messageBottom);c.customize&&(n=c.customize(n,c,b));c=i("",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("');o.close();t.location.hash=n}}}();return s}()})(jQuery,this); diff --git a/fassets/js/plugins.hoveranimation.js b/fassets/js/plugins.hoveranimation.js new file mode 100644 index 0000000..e16702e --- /dev/null +++ b/fassets/js/plugins.hoveranimation.js @@ -0,0 +1,68 @@ +window.scwHoverAnimationPlugin = window.scwHoverAnimationPlugin || {}; + +window.SEMICOLON_hoverAnimationInit = function( $hoverAnimationEl ){ + + $hoverAnimationEl = $hoverAnimationEl.filter(':not(.customjs)'); + + if( $hoverAnimationEl.length < 1 ){ + return true; + } + + $hoverAnimationEl.each(function(){ + let element = $(this), + elAnimate = element.attr( 'data-hover-animate' ), + elAnimateOut = element.attr( 'data-hover-animate-out' ) || 'fadeOut', + elSpeed = element.attr( 'data-hover-speed' ) || 600, + elDelay = element.attr( 'data-hover-delay' ), + elParent = element.attr( 'data-hover-parent' ), + elReset = element.attr( 'data-hover-reset' ) || 'false'; + + element.addClass( 'not-animated' ); + + if( !elParent ) { + if( element.parents( '.bg-overlay' ).length > 0 ) { + elParent = element.parents( '.bg-overlay' ); + } else { + elParent = element; + } + } else { + if( elParent == 'self' ) { + elParent = element; + } else { + elParent = element.parents( elParent ); + } + } + + let elDelayT = 0; + + if( elDelay ) { + elDelayT = Number( elDelay ); + } + + if( elSpeed ) { + element.css({ 'animation-duration': Number( elSpeed ) + 'ms' }); + } + + let t, x; + + elParent.hover( function(){ + + clearTimeout( x ); + t = setTimeout( function(){ + element.addClass( 'not-animated' ).removeClass( elAnimateOut + ' not-animated' ).addClass( elAnimate + ' animated' ); + }, elDelayT ); + + }, function(){ + + element.addClass( 'not-animated' ).removeClass( elAnimate + ' not-animated' ).addClass( elAnimateOut + ' animated' ); + if( elReset == 'true' ) { + x = setTimeout( function(){ + element.removeClass( elAnimateOut + ' animated' ).addClass( 'not-animated' ); + }, Number( elSpeed ) ); + } + clearTimeout( t ); + + }); + }); + +}; diff --git a/fassets/js/plugins.html5video.js b/fassets/js/plugins.html5video.js new file mode 100644 index 0000000..e413013 --- /dev/null +++ b/fassets/js/plugins.html5video.js @@ -0,0 +1,44 @@ +window.scwHtml5VideoPlugin = window.scwHtml5VideoPlugin || {}; + +window.SEMICOLON_html5VideoInit = function( $html5Video ){ + + if( $html5Video.length < 1 ){ + return true; + } + + $html5Video.each(function(){ + let element = $(this), + elVideo = element.find('video'), + divWidth = element.outerWidth(), + divHeight = element.outerHeight(), + elWidth = ( (16*divHeight)/9 ), + elHeight = divHeight; + + if( elWidth < divWidth ) { + elWidth = divWidth; + elHeight = ( (9*divWidth)/16 ); + } + + elVideo.css({ width: elWidth+'px', height: elHeight+'px' }); + + if( elHeight > divHeight ) { + elVideo.css({ 'left': '', 'top': -( ( elHeight - divHeight )/2 )+'px' }); + } + + if( elWidth > divWidth ) { + elVideo.css({ 'top': '', 'left': -( ( elWidth - divWidth )/2 )+'px' }); + } + + if( SEMICOLON.isMobile.any() && !element.hasClass('no-placeholder') ) { + let placeholderImg = elVideo.attr('poster'); + + if( placeholderImg != '' ) { + element.append('
') + } + + elVideo.hide(); + } + }); + +}; + diff --git a/fassets/js/plugins.imagesloaded.js b/fassets/js/plugins.imagesloaded.js new file mode 100644 index 0000000..bcccd8a --- /dev/null +++ b/fassets/js/plugins.imagesloaded.js @@ -0,0 +1,7 @@ +/*! + * imagesLoaded PACKAGED v4.1.4 + * JavaScript is all like "You images are done yet or what?" + * MIT License + */ + +!function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return n.indexOf(t)==-1&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{},n=i[e]=i[e]||{};return n[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return n!=-1&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o=0,this.isPrefilling?(this.log("prefill"),this.loadNextPage()):this.stopPrefill()},s.getPrefillDistance=function(){return this.options.elementScroll?this.scroller.clientHeight-this.scroller.scrollHeight:this.windowHeight-this.element.clientHeight},s.stopPrefill=function(){this.log("stopPrefill"),this.off("append",this.prefill)},e}),function(t,e){"function"==typeof define&&define.amd?define("infinite-scroll/js/scroll-watch",["./core","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){var n=e.prototype;return e.defaults.scrollThreshold=400,e.create.scrollWatch=function(){this.pageScrollHandler=this.onPageScroll.bind(this),this.resizeHandler=this.onResize.bind(this);var t=this.options.scrollThreshold,e=t||0===t;e&&this.enableScrollWatch()},e.destroy.scrollWatch=function(){this.disableScrollWatch()},n.enableScrollWatch=function(){this.isScrollWatching||(this.isScrollWatching=!0,this.updateMeasurements(),this.updateScroller(),this.on("last",this.disableScrollWatch),this.bindScrollWatchEvents(!0))},n.disableScrollWatch=function(){this.isScrollWatching&&(this.bindScrollWatchEvents(!1),delete this.isScrollWatching)},n.bindScrollWatchEvents=function(e){var i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.pageScrollHandler),t[i]("resize",this.resizeHandler)},n.onPageScroll=e.throttle(function(){var t=this.getBottomDistance();t<=this.options.scrollThreshold&&this.dispatchEvent("scrollThreshold")}),n.getBottomDistance=function(){return this.options.elementScroll?this.getElementBottomDistance():this.getWindowBottomDistance()},n.getWindowBottomDistance=function(){var e=this.top+this.element.clientHeight,i=t.pageYOffset+this.windowHeight;return e-i},n.getElementBottomDistance=function(){var t=this.scroller.scrollHeight,e=this.scroller.scrollTop+this.scroller.clientHeight;return t-e},n.onResize=function(){this.updateMeasurements()},i.debounceMethod(e,"onResize",150),e}),function(t,e){"function"==typeof define&&define.amd?define("infinite-scroll/js/history",["./core","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){var n=e.prototype;e.defaults.history="replace";var o=document.createElement("a");return e.create.history=function(){if(this.options.history){o.href=this.getAbsolutePath();var t=o.origin||o.protocol+"//"+o.host,e=t==location.origin;return e?void(this.options.append?this.createHistoryAppend():this.createHistoryPageLoad()):void console.error("[InfiniteScroll] cannot set history with different origin: "+o.origin+" on "+location.origin+" . History behavior disabled.")}},n.createHistoryAppend=function(){this.updateMeasurements(),this.updateScroller(),this.scrollPages=[{top:0,path:location.href,title:document.title}],this.scrollPageIndex=0,this.scrollHistoryHandler=this.onScrollHistory.bind(this),this.unloadHandler=this.onUnload.bind(this),this.scroller.addEventListener("scroll",this.scrollHistoryHandler),this.on("append",this.onAppendHistory),this.bindHistoryAppendEvents(!0)},n.bindHistoryAppendEvents=function(e){var i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.scrollHistoryHandler),t[i]("unload",this.unloadHandler)},n.createHistoryPageLoad=function(){this.on("load",this.onPageLoadHistory)},e.destroy.history=n.destroyHistory=function(){var t=this.options.history&&this.options.append;t&&this.bindHistoryAppendEvents(!1)},n.onAppendHistory=function(t,e,i){if(i&&i.length){var n=i[0],r=this.getElementScrollY(n);o.href=e,this.scrollPages.push({top:r,path:o.href,title:t.title})}},n.getElementScrollY=function(t){return this.options.elementScroll?this.getElementElementScrollY(t):this.getElementWindowScrollY(t)},n.getElementWindowScrollY=function(e){var i=e.getBoundingClientRect();return i.top+t.pageYOffset},n.getElementElementScrollY=function(t){return t.offsetTop-this.top},n.onScrollHistory=function(){for(var t,e,i=this.getScrollViewY(),n=0;n=i)break;t=n,e=o}t!=this.scrollPageIndex&&(this.scrollPageIndex=t,this.setHistory(e.title,e.path))},i.debounceMethod(e,"onScrollHistory",150),n.getScrollViewY=function(){return this.options.elementScroll?this.scroller.scrollTop+this.scroller.clientHeight/2:t.pageYOffset+this.windowHeight/2},n.setHistory=function(t,e){var i=this.options.history,n=i&&history[i+"State"];n&&(history[i+"State"](null,t,e),this.options.historyTitle&&(document.title=t),this.dispatchEvent("history",null,[t,e]))},n.onUnload=function(){var e=this.scrollPageIndex;if(0!==e){var i=this.scrollPages[e],n=t.pageYOffset-i.top+this.top;this.destroyHistory(),scrollTo(0,n)}},n.onPageLoadHistory=function(t,e){this.setHistory(t.title,e)},e}),function(t,e){"function"==typeof define&&define.amd?define("infinite-scroll/js/button",["./core","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){function n(t,e){this.element=t,this.infScroll=e,this.clickHandler=this.onClick.bind(this),this.element.addEventListener("click",this.clickHandler),e.on("request",this.disable.bind(this)),e.on("load",this.enable.bind(this)),e.on("error",this.hide.bind(this)),e.on("last",this.hide.bind(this))}return e.create.button=function(){var t=i.getQueryElement(this.options.button);if(t)return void(this.button=new n(t,this))},e.destroy.button=function(){this.button&&this.button.destroy()},n.prototype.onClick=function(t){t.preventDefault(),this.infScroll.loadNextPage()},n.prototype.enable=function(){this.element.removeAttribute("disabled")},n.prototype.disable=function(){this.element.disabled="disabled"},n.prototype.hide=function(){this.element.style.display="none"},n.prototype.destroy=function(){this.element.removeEventListener("click",this.clickHandler)},e.Button=n,e}),function(t,e){"function"==typeof define&&define.amd?define("infinite-scroll/js/status",["./core","fizzy-ui-utils/utils"],function(i,n){return e(t,i,n)}):"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){function n(t){r(t,"none")}function o(t){r(t,"block")}function r(t,e){t&&(t.style.display=e)}var s=e.prototype;return e.create.status=function(){var t=i.getQueryElement(this.options.status);t&&(this.statusElement=t,this.statusEventElements={request:t.querySelector(".infinite-scroll-request"),error:t.querySelector(".infinite-scroll-error"),last:t.querySelector(".infinite-scroll-last")},this.on("request",this.showRequestStatus),this.on("error",this.showErrorStatus),this.on("last",this.showLastStatus),this.bindHideStatus("on"))},s.bindHideStatus=function(t){var e=this.options.append?"append":"load";this[t](e,this.hideAllStatus)},s.showRequestStatus=function(){this.showStatus("request")},s.showErrorStatus=function(){this.showStatus("error")},s.showLastStatus=function(){this.showStatus("last"),this.bindHideStatus("off")},s.showStatus=function(t){o(this.statusElement),this.hideStatusEventElements();var e=this.statusEventElements[t];o(e)},s.hideAllStatus=function(){n(this.statusElement),this.hideStatusEventElements()},s.hideStatusEventElements=function(){for(var t in this.statusEventElements){var e=this.statusEventElements[t];n(e)}},e}),function(t,e){"function"==typeof define&&define.amd?define(["infinite-scroll/js/core","infinite-scroll/js/page-load","infinite-scroll/js/scroll-watch","infinite-scroll/js/history","infinite-scroll/js/button","infinite-scroll/js/status"],e):"object"==typeof module&&module.exports&&(module.exports=e(require("./core"),require("./page-load"),require("./scroll-watch"),require("./history"),require("./button"),require("./status")))}(window,function(t){return t}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("imagesloaded/imagesloaded",["ev-emitter/ev-emitter"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}("undefined"!=typeof window?window:this,function(t,e){function i(t,e){for(var i in e)t[i]=e[i];return t}function n(t){if(Array.isArray(t))return t;var e="object"==typeof t&&"number"==typeof t.length;return e?h.call(t):[t]}function o(t,e,r){if(!(this instanceof o))return new o(t,e,r);var s=t;return"string"==typeof t&&(s=document.querySelectorAll(t)),s?(this.elements=n(s),this.options=i({},this.options),"function"==typeof e?r=e:i(this.options,e),r&&this.on("always",r),this.getImages(),l&&(this.jqDeferred=new l.Deferred),void setTimeout(this.check.bind(this))):void a.error("Bad element for imagesLoaded "+(s||t))}function r(t){this.img=t}function s(t,e){this.url=t,this.element=e,this.img=new Image}var l=t.jQuery,a=t.console,h=Array.prototype.slice;o.prototype=Object.create(e.prototype),o.prototype.options={},o.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},o.prototype.addElementImages=function(t){"IMG"==t.nodeName&&this.addImage(t),this.options.background===!0&&this.addElementBackgroundImages(t);var e=t.nodeType;if(e&&c[e]){for(var i=t.querySelectorAll("img"),n=0;n 12 ) { + elLimit = 12; + } + + SEMICOLON_getInstagramPhotos( element, elUsername, elLimit, '', false ); + }); + +}; + +window.SEMICOLON_getInstagramPhotos = function( element, username, limit, nextkey, images ) { + + let newimages = ''; + + $.getJSON( 'https://www.instagram.com/'+ username +'/?__a=1'+nextkey, function( instagram ){ + + let instaUser = instagram.graphql.user, + instaTimeline = instaUser.edge_owner_to_timeline_media, + instaPrivate = instaUser.is_private; + + if( !instaPrivate ) { + + if( images ) { + images = images.concat( instaTimeline.edges ); + } else { + images = instaTimeline.edges; + } + + if( nextkey != '' ) { + nextkey = '&max_id='+instaTimeline.page_info.end_cursor; + } + + if( images.length < limit ) { + images = SEMICOLON_getInstagramPhotos( element, username, limit, nextkey, images ); + } + + if( images.length > 0 ) { + let html = ''; + for (let i = 0; i < limit; i++) { + if ( i === limit ) + continue; + + let photo = images[i]; + + html = html+'Image'; + } + + element.html( html ).removeClass('customjs'); + SEMICOLON.widget.masonryThumbs(); + } + + } else { + console.log( 'Private Account!' ); + return false; + } + + }); + + return newimages; + +} diff --git a/fassets/js/plugins.instagram.js b/fassets/js/plugins.instagram.js new file mode 100644 index 0000000..f08efd1 --- /dev/null +++ b/fassets/js/plugins.instagram.js @@ -0,0 +1,61 @@ +window.scwInstagramPlugin = window.scwInstagramPlugin || {}; + +window.SEMICOLON_instagramPhotosInit = function( $instagramPhotosEl ){ + + if( $instagramPhotosEl.length < 1 ){ + return true; + } + + $instagramPhotosEl.each(function() { + let element = $(this), + elLimit = element.attr('data-count') || 12, + elLoader = element.attr('data-loader') || 'include/instagram/instagram.php', + elFetch = element.attr('data-fetch-message') || 'Fetching Photos from Instagram...'; + + if( Number( elLimit ) > 12 ) { + elLimit = 12; + } + + SEMICOLON_getInstagramPhotos( element, elLoader, elLimit, elFetch ); + }); + +}; + +window.SEMICOLON_getInstagramPhotos = function( element, loader, limit, fetchAlert ) { + + let newimages = ''; + + element.after( '
Loading...
'+ fetchAlert +'
' ); + + $.getJSON( loader, function( images ){ + + if( images.length > 0 ) { + element.parents().find( '.instagram-widget-alert' ).remove(); + let html = ''; + for (let i = 0; i < limit; i++) { + if ( i === limit ) + continue; + + let photo = images[i], + thumb = photo.media_url; + if( photo.media_type === 'VIDEO' ) { + thumb = photo.thumbnail_url; + } + element.append( 'Image' ); + + // $.getJSON( 'https://graph.instagram.com/' + images[i].id + '?fields=media_url,permalink,media_type,thumbnail_url&access_token=' + accessToken, function( photo ){ + + // }); + + } + } + + element.removeClass('customjs'); + setTimeout( function(){ + SEMICOLON.widget.gridInit(); + SEMICOLON.widget.masonryThumbs(); + }, 500); + + }); + +}; diff --git a/fassets/js/plugins.isotope.js b/fassets/js/plugins.isotope.js new file mode 100644 index 0000000..8ca3b51 --- /dev/null +++ b/fassets/js/plugins.isotope.js @@ -0,0 +1,82 @@ +/*! + * Isotope PACKAGED v3.0.6 + * + * Licensed GPLv3 for open source use + * or Isotope Commercial License for commercial use + * + * https://isotope.metafizzy.co + * Copyright 2010-2018 Metafizzy + */ + +!function(t,e){"function"==typeof define&&define.amd?define("jquery-bridget/jquery-bridget",["jquery"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("jquery")):t.jQueryBridget=e(t,t.jQuery)}(window,function(t,e){"use strict";function i(i,s,a){function u(t,e,o){var n,s="$()."+i+'("'+e+'")';return t.each(function(t,u){var h=a.data(u,i);if(!h)return void r(i+" not initialized. Cannot call methods, i.e. "+s);var d=h[e];if(!d||"_"==e.charAt(0))return void r(s+" is not a valid method");var l=d.apply(h,o);n=void 0===n?l:n}),void 0!==n?n:t}function h(t,e){t.each(function(t,o){var n=a.data(o,i);n?(n.option(e),n._init()):(n=new s(o,e),a.data(o,i,n))})}a=a||e||t.jQuery,a&&(s.prototype.option||(s.prototype.option=function(t){a.isPlainObject(t)&&(this.options=a.extend(!0,this.options,t))}),a.fn[i]=function(t){if("string"==typeof t){var e=n.call(arguments,1);return u(this,t,e)}return h(this,t),this},o(a))}function o(t){!t||t&&t.bridget||(t.bridget=i)}var n=Array.prototype.slice,s=t.console,r="undefined"==typeof s?function(){}:function(t){s.error(t)};return o(e||t.jQuery),i}),function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},o=i[t]=i[t]||[];return o.indexOf(e)==-1&&o.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{},o=i[t]=i[t]||{};return o[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var o=i.indexOf(e);return o!=-1&&i.splice(o,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){i=i.slice(0),e=e||[];for(var o=this._onceEvents&&this._onceEvents[t],n=0;n
'; + } else if( elLoader == '8' ) { + elLoaderAppend = '
'; + } else if( elLoader == '9' ) { + elLoaderAppend = '
'; + } else if( elLoader == '10' ) { + elLoaderAppend = '
'; + } else if( elLoader == '11' ) { + elLoaderAppend = '
'; + } else if( elLoader == '12' ) { + elLoaderAppend = '
'; + } else if( elLoader == '13' ) { + elLoaderAppend = '
'; + } else if( elLoader == '14' ) { + elLoaderAppend = '
'; + } else { + elLoaderAppend = '
'; + } + + if( !elLoaderHtml ) { + elLoaderHtml = elLoaderAppend; + } + + elLoaderHtml = elLoaderBefore + elLoaderHtml + elLoaderAfter; + + $wrapper.css({ 'opacity': 1 }); + + $wrapper.animsition({ + inClass: elAnimIn, + outClass: elAnimOut, + inDuration: Number(elSpeedIn), + outDuration: Number(elSpeedOut), + linkElement: 'body:not(.device-md):not(.device-sm):not(.device-xs) .primary-menu:not(.on-click) .menu-link:not([target="_blank"]):not([href*="#"]):not([data-lightbox]):not([href^="mailto"]):not([href^="tel"]):not([href^="sms"]):not([href^="call"])', + loading: true, + loadingParentElement: 'body', + loadingClass: 'page-transition-wrap', + loadingInner: elLoaderHtml, + timeout: elTimeoutActive, + timeoutCountdown: elTimeout, + onLoadEvent: true, + browser: [ 'animation-duration', '-webkit-animation-duration'], + overlay: false, + overlayClass: 'animsition-overlay-slide', + overlayParentElement: 'body' + }); + +}; + + + +/*! skrollr 0.6.30 (2015-06-19) | Alexander Prinzhorn - https://github.com/Prinzhorn/skrollr | Free to use under terms of MIT license */ +!function(a,b,c){"use strict";function d(c){if(e=b.documentElement,f=b.body,T(),ha=this,c=c||{},ma=c.constants||{},c.easing)for(var d in c.easing)W[d]=c.easing[d];ta=c.edgeStrategy||"set",ka={beforerender:c.beforerender,render:c.render,keyframe:c.keyframe},la=c.forceHeight!==!1,la&&(Ka=c.scale||1),na=c.mobileDeceleration||y,pa=c.smoothScrolling!==!1,qa=c.smoothScrollingDuration||A,ra={targetTop:ha.getScrollTop()},Sa=(c.mobileCheck||function(){return/Android|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent||navigator.vendor||a.opera)})(),Sa?(ja=b.getElementById(c.skrollrBody||z),ja&&ga(),X(),Ea(e,[s,v],[t])):Ea(e,[s,u],[t]),ha.refresh(),wa(a,"resize orientationchange",function(){var a=e.clientWidth,b=e.clientHeight;(b!==Pa||a!==Oa)&&(Pa=b,Oa=a,Qa=!0)});var g=U();return function h(){$(),va=g(h)}(),ha}var e,f,g={get:function(){return ha},init:function(a){return ha||new d(a)},VERSION:"0.6.29"},h=Object.prototype.hasOwnProperty,i=a.Math,j=a.getComputedStyle,k="touchstart",l="touchmove",m="touchcancel",n="touchend",o="skrollable",p=o+"-before",q=o+"-between",r=o+"-after",s="skrollr",t="no-"+s,u=s+"-desktop",v=s+"-mobile",w="linear",x=1e3,y=.004,z="skrollr-body",A=200,B="start",C="end",D="center",E="bottom",F="___skrollable_id",G=/^(?:input|textarea|button|select)$/i,H=/^\s+|\s+$/g,I=/^data(?:-(_\w+))?(?:-?(-?\d*\.?\d+p?))?(?:-?(start|end|top|center|bottom))?(?:-?(top|center|bottom))?$/,J=/\s*(@?[\w\-\[\]]+)\s*:\s*(.+?)\s*(?:;|$)/gi,K=/^(@?[a-z\-]+)\[(\w+)\]$/,L=/-([a-z0-9_])/g,M=function(a,b){return b.toUpperCase()},N=/[\-+]?[\d]*\.?[\d]+/g,O=/\{\?\}/g,P=/rgba?\(\s*-?\d+\s*,\s*-?\d+\s*,\s*-?\d+/g,Q=/[a-z\-]+-gradient/g,R="",S="",T=function(){var a=/^(?:O|Moz|webkit|ms)|(?:-(?:o|moz|webkit|ms)-)/;if(j){var b=j(f,null);for(var c in b)if(R=c.match(a)||+c==c&&b[c].match(a))break;if(!R)return void(R=S="");R=R[0],"-"===R.slice(0,1)?(S=R,R={"-webkit-":"webkit","-moz-":"Moz","-ms-":"ms","-o-":"O"}[R]):S="-"+R.toLowerCase()+"-"}},U=function(){var b=a.requestAnimationFrame||a[R.toLowerCase()+"RequestAnimationFrame"],c=Ha();return(Sa||!b)&&(b=function(b){var d=Ha()-c,e=i.max(0,1e3/60-d);return a.setTimeout(function(){c=Ha(),b()},e)}),b},V=function(){var b=a.cancelAnimationFrame||a[R.toLowerCase()+"CancelAnimationFrame"];return(Sa||!b)&&(b=function(b){return a.clearTimeout(b)}),b},W={begin:function(){return 0},end:function(){return 1},linear:function(a){return a},quadratic:function(a){return a*a},cubic:function(a){return a*a*a},swing:function(a){return-i.cos(a*i.PI)/2+.5},sqrt:function(a){return i.sqrt(a)},outCubic:function(a){return i.pow(a-1,3)+1},bounce:function(a){var b;if(.5083>=a)b=3;else if(.8489>=a)b=9;else if(.96208>=a)b=27;else{if(!(.99981>=a))return 1;b=91}return 1-i.abs(3*i.cos(a*b*1.028)/b)}};d.prototype.refresh=function(a){var d,e,f=!1;for(a===c?(f=!0,ia=[],Ra=0,a=b.getElementsByTagName("*")):a.length===c&&(a=[a]),d=0,e=a.length;e>d;d++){var g=a[d],h=g,i=[],j=pa,k=ta,l=!1;if(f&&F in g&&delete g[F],g.attributes){for(var m=0,n=g.attributes.length;n>m;m++){var p=g.attributes[m];if("data-anchor-target"!==p.name)if("data-smooth-scrolling"!==p.name)if("data-edge-strategy"!==p.name)if("data-emit-events"!==p.name){var q=p.name.match(I);if(null!==q){var r={props:p.value,element:g,eventType:p.name.replace(L,M)};i.push(r);var s=q[1];s&&(r.constant=s.substr(1));var t=q[2];/p$/.test(t)?(r.isPercentage=!0,r.offset=(0|t.slice(0,-1))/100):r.offset=0|t;var u=q[3],v=q[4]||u;u&&u!==B&&u!==C?(r.mode="relative",r.anchors=[u,v]):(r.mode="absolute",u===C?r.isEnd=!0:r.isPercentage||(r.offset=r.offset*Ka))}}else l=!0;else k=p.value;else j="off"!==p.value;else if(h=b.querySelector(p.value),null===h)throw'Unable to find anchor target "'+p.value+'"'}if(i.length){var w,x,y;!f&&F in g?(y=g[F],w=ia[y].styleAttr,x=ia[y].classAttr):(y=g[F]=Ra++,w=g.style.cssText,x=Da(g)),ia[y]={element:g,styleAttr:w,classAttr:x,anchorTarget:h,keyFrames:i,smoothScrolling:j,edgeStrategy:k,emitEvents:l,lastFrameIndex:-1},Ea(g,[o],[])}}}for(Aa(),d=0,e=a.length;e>d;d++){var z=ia[a[d][F]];z!==c&&(_(z),ba(z))}return ha},d.prototype.relativeToAbsolute=function(a,b,c){var d=e.clientHeight,f=a.getBoundingClientRect(),g=f.top,h=f.bottom-f.top;return b===E?g-=d:b===D&&(g-=d/2),c===E?g+=h:c===D&&(g+=h/2),g+=ha.getScrollTop(),g+.5|0},d.prototype.animateTo=function(a,b){b=b||{};var d=Ha(),e=ha.getScrollTop(),f=b.duration===c?x:b.duration;return oa={startTop:e,topDiff:a-e,targetTop:a,duration:f,startTime:d,endTime:d+f,easing:W[b.easing||w],done:b.done},oa.topDiff||(oa.done&&oa.done.call(ha,!1),oa=c),ha},d.prototype.stopAnimateTo=function(){oa&&oa.done&&oa.done.call(ha,!0),oa=c},d.prototype.isAnimatingTo=function(){return!!oa},d.prototype.isMobile=function(){return Sa},d.prototype.setScrollTop=function(b,c){return sa=c===!0,Sa?Ta=i.min(i.max(b,0),Ja):a.scrollTo(0,b),ha},d.prototype.getScrollTop=function(){return Sa?Ta:a.pageYOffset||e.scrollTop||f.scrollTop||0},d.prototype.getMaxScrollTop=function(){return Ja},d.prototype.on=function(a,b){return ka[a]=b,ha},d.prototype.off=function(a){return delete ka[a],ha},d.prototype.destroy=function(){var a=V();a(va),ya(),Ea(e,[t],[s,u,v]);for(var b=0,d=ia.length;d>b;b++)fa(ia[b].element);e.style.overflow=f.style.overflow="",e.style.height=f.style.height="",ja&&g.setStyle(ja,"transform","none"),ha=c,ja=c,ka=c,la=c,Ja=0,Ka=1,ma=c,na=c,La="down",Ma=-1,Oa=0,Pa=0,Qa=!1,oa=c,pa=c,qa=c,ra=c,sa=c,Ra=0,ta=c,Sa=!1,Ta=0,ua=c};var X=function(){var d,g,h,j,o,p,q,r,s,t,u,v;wa(e,[k,l,m,n].join(" "),function(a){var e=a.changedTouches[0];for(j=a.target;3===j.nodeType;)j=j.parentNode;switch(o=e.clientY,p=e.clientX,t=a.timeStamp,G.test(j.tagName)||a.preventDefault(),a.type){case k:d&&d.blur(),ha.stopAnimateTo(),d=j,g=q=o,h=p,s=t;break;case l:G.test(j.tagName)&&b.activeElement!==j&&a.preventDefault(),r=o-q,v=t-u,ha.setScrollTop(Ta-r,!0),q=o,u=t;break;default:case m:case n:var f=g-o,w=h-p,x=w*w+f*f;if(49>x){if(!G.test(d.tagName)){d.focus();var y=b.createEvent("MouseEvents");y.initMouseEvent("click",!0,!0,a.view,1,e.screenX,e.screenY,e.clientX,e.clientY,a.ctrlKey,a.altKey,a.shiftKey,a.metaKey,0,null),d.dispatchEvent(y)}return}d=c;var z=r/v;z=i.max(i.min(z,3),-3);var A=i.abs(z/na),B=z*A+.5*na*A*A,C=ha.getScrollTop()-B,D=0;C>Ja?(D=(Ja-C)/B,C=Ja):0>C&&(D=-C/B,C=0),A*=1-D,ha.animateTo(C+.5|0,{easing:"outCubic",duration:A})}}),a.scrollTo(0,0),e.style.overflow=f.style.overflow="hidden"},Y=function(){var a,b,c,d,f,g,h,j,k,l,m,n=e.clientHeight,o=Ba();for(j=0,k=ia.length;k>j;j++)for(a=ia[j],b=a.element,c=a.anchorTarget,d=a.keyFrames,f=0,g=d.length;g>f;f++)h=d[f],l=h.offset,m=o[h.constant]||0,h.frame=l,h.isPercentage&&(l*=n,h.frame=l),"relative"===h.mode&&(fa(b),h.frame=ha.relativeToAbsolute(c,h.anchors[0],h.anchors[1])-l,fa(b,!0)),h.frame+=m,la&&!h.isEnd&&h.frame>Ja&&(Ja=h.frame);for(Ja=i.max(Ja,Ca()),j=0,k=ia.length;k>j;j++){for(a=ia[j],d=a.keyFrames,f=0,g=d.length;g>f;f++)h=d[f],m=o[h.constant]||0,h.isEnd&&(h.frame=Ja-h.offset+m);a.keyFrames.sort(Ia)}},Z=function(a,b){for(var c=0,d=ia.length;d>c;c++){var e,f,i=ia[c],j=i.element,k=i.smoothScrolling?a:b,l=i.keyFrames,m=l.length,n=l[0],s=l[l.length-1],t=ks.frame,v=t?n:s,w=i.emitEvents,x=i.lastFrameIndex;if(t||u){if(t&&-1===i.edge||u&&1===i.edge)continue;switch(t?(Ea(j,[p],[r,q]),w&&x>-1&&(za(j,n.eventType,La),i.lastFrameIndex=-1)):(Ea(j,[r],[p,q]),w&&m>x&&(za(j,s.eventType,La),i.lastFrameIndex=m)),i.edge=t?-1:1,i.edgeStrategy){case"reset":fa(j);continue;case"ease":k=v.frame;break;default:case"set":var y=v.props;for(e in y)h.call(y,e)&&(f=ea(y[e].value),0===e.indexOf("@")?j.setAttribute(e.substr(1),f):g.setStyle(j,e,f));continue}}else 0!==i.edge&&(Ea(j,[o,q],[p,r]),i.edge=0);for(var z=0;m-1>z;z++)if(k>=l[z].frame&&k<=l[z+1].frame){var A=l[z],B=l[z+1];for(e in A.props)if(h.call(A.props,e)){var C=(k-A.frame)/(B.frame-A.frame);C=A.props[e].easing(C),f=da(A.props[e].value,B.props[e].value,C),f=ea(f),0===e.indexOf("@")?j.setAttribute(e.substr(1),f):g.setStyle(j,e,f)}w&&x!==z&&("down"===La?za(j,A.eventType,La):za(j,B.eventType,La),i.lastFrameIndex=z);break}}},$=function(){Qa&&(Qa=!1,Aa());var a,b,d=ha.getScrollTop(),e=Ha();if(oa)e>=oa.endTime?(d=oa.targetTop,a=oa.done,oa=c):(b=oa.easing((e-oa.startTime)/oa.duration),d=oa.startTop+b*oa.topDiff|0),ha.setScrollTop(d,!0);else if(!sa){var f=ra.targetTop-d;f&&(ra={startTop:Ma,topDiff:d-Ma,targetTop:d,startTime:Na,endTime:Na+qa}),e<=ra.endTime&&(b=W.sqrt((e-ra.startTime)/qa),d=ra.startTop+b*ra.topDiff|0)}if(sa||Ma!==d){La=d>Ma?"down":Ma>d?"up":La,sa=!1;var h={curTop:d,lastTop:Ma,maxTop:Ja,direction:La},i=ka.beforerender&&ka.beforerender.call(ha,h);i!==!1&&(Z(d,ha.getScrollTop()),Sa&&ja&&g.setStyle(ja,"transform","translate(0, "+-Ta+"px) "+ua),Ma=d,ka.render&&ka.render.call(ha,h)),a&&a.call(ha,!1)}Na=e},_=function(a){for(var b=0,c=a.keyFrames.length;c>b;b++){for(var d,e,f,g,h=a.keyFrames[b],i={};null!==(g=J.exec(h.props));)f=g[1],e=g[2],d=f.match(K),null!==d?(f=d[1],d=d[2]):d=w,e=e.indexOf("!")?aa(e):[e.slice(1)],i[f]={value:e,easing:W[d]};h.props=i}},aa=function(a){var b=[];return P.lastIndex=0,a=a.replace(P,function(a){return a.replace(N,function(a){return a/255*100+"%"})}),S&&(Q.lastIndex=0,a=a.replace(Q,function(a){return S+a})),a=a.replace(N,function(a){return b.push(+a),"{?}"}),b.unshift(a),b},ba=function(a){var b,c,d={};for(b=0,c=a.keyFrames.length;c>b;b++)ca(a.keyFrames[b],d);for(d={},b=a.keyFrames.length-1;b>=0;b--)ca(a.keyFrames[b],d)},ca=function(a,b){var c;for(c in b)h.call(a.props,c)||(a.props[c]=b[c]);for(c in a.props)b[c]=a.props[c]},da=function(a,b,c){var d,e=a.length;if(e!==b.length)throw"Can't interpolate between \""+a[0]+'" and "'+b[0]+'"';var f=[a[0]];for(d=1;e>d;d++)f[d]=a[d]+(b[d]-a[d])*c;return f},ea=function(a){var b=1;return O.lastIndex=0,a[0].replace(O,function(){return a[b++]})},fa=function(a,b){a=[].concat(a);for(var c,d,e=0,f=a.length;f>e;e++)d=a[e],c=ia[d[F]],c&&(b?(d.style.cssText=c.dirtyStyleAttr,Ea(d,c.dirtyClassAttr)):(c.dirtyStyleAttr=d.style.cssText,c.dirtyClassAttr=Da(d),d.style.cssText=c.styleAttr,Ea(d,c.classAttr)))},ga=function(){ua="translateZ(0)",g.setStyle(ja,"transform",ua);var a=j(ja),b=a.getPropertyValue("transform"),c=a.getPropertyValue(S+"transform"),d=b&&"none"!==b||c&&"none"!==c;d||(ua="")};g.setStyle=function(a,b,c){var d=a.style;if(b=b.replace(L,M).replace("-",""),"zIndex"===b)isNaN(c)?d[b]=c:d[b]=""+(0|c);else if("float"===b)d.styleFloat=d.cssFloat=c;else try{R&&(d[R+b.slice(0,1).toUpperCase()+b.slice(1)]=c),d[b]=c}catch(e){}};var ha,ia,ja,ka,la,ma,na,oa,pa,qa,ra,sa,ta,ua,va,wa=g.addEvent=function(b,c,d){var e=function(b){return b=b||a.event,b.target||(b.target=b.srcElement),b.preventDefault||(b.preventDefault=function(){b.returnValue=!1,b.defaultPrevented=!0}),d.call(this,b)};c=c.split(" ");for(var f,g=0,h=c.length;h>g;g++)f=c[g],b.addEventListener?b.addEventListener(f,d,!1):b.attachEvent("on"+f,e),Ua.push({element:b,name:f,listener:d})},xa=g.removeEvent=function(a,b,c){b=b.split(" ");for(var d=0,e=b.length;e>d;d++)a.removeEventListener?a.removeEventListener(b[d],c,!1):a.detachEvent("on"+b[d],c)},ya=function(){for(var a,b=0,c=Ua.length;c>b;b++)a=Ua[b],xa(a.element,a.name,a.listener);Ua=[]},za=function(a,b,c){ka.keyframe&&ka.keyframe.call(ha,a,b,c)},Aa=function(){var a=ha.getScrollTop();Ja=0,la&&!Sa&&(f.style.height=""),Y(),la&&!Sa&&(f.style.height=Ja+e.clientHeight+"px"),Sa?ha.setScrollTop(i.min(ha.getScrollTop(),Ja)):ha.setScrollTop(a,!0),sa=!0},Ba=function(){var a,b,c=e.clientHeight,d={};for(a in ma)b=ma[a],"function"==typeof b?b=b.call(ha):/p$/.test(b)&&(b=b.slice(0,-1)/100*c),d[a]=b;return d},Ca=function(){var a,b=0;return ja&&(b=i.max(ja.offsetHeight,ja.scrollHeight)),a=i.max(b,f.scrollHeight,f.offsetHeight,e.scrollHeight,e.offsetHeight,e.clientHeight),a-e.clientHeight},Da=function(b){var c="className";return a.SVGElement&&b instanceof a.SVGElement&&(b=b[c],c="baseVal"),b[c]},Ea=function(b,d,e){var f="className";if(a.SVGElement&&b instanceof a.SVGElement&&(b=b[f],f="baseVal"),e===c)return void(b[f]=d);for(var g=b[f],h=0,i=e.length;i>h;h++)g=Ga(g).replace(Ga(e[h])," ");g=Fa(g);for(var j=0,k=d.length;k>j;j++)-1===Ga(g).indexOf(Ga(d[j]))&&(g+=" "+d[j]);b[f]=Fa(g)},Fa=function(a){return a.replace(H,"")},Ga=function(a){return" "+a+" "},Ha=Date.now||function(){return+new Date},Ia=function(a,b){return a.frame-b.frame},Ja=0,Ka=1,La="down",Ma=-1,Na=Ha(),Oa=0,Pa=0,Qa=!1,Ra=0,Sa=!1,Ta=0,Ua=[];"function"==typeof define&&define.amd?define([],function(){return g}):"undefined"!=typeof module&&module.exports?module.exports=g:a.skrollr=g}(window,document); + +window.SEMICOLON_parallaxInit = function( $parallaxEl ){ + + $parallaxEl = $parallaxEl.filter(':not(.customjs)'); + + if( $parallaxEl.length < 1 ){ + return true; + } + + if( !SEMICOLON.isMobile.any() ){ + window.skrollrInstance = skrollr.init({forceHeight: false}); + } else { + $parallaxEl.addClass('mobile-parallax'); + } + +}; + + + +/**! + * easy-pie-chart + * Lightweight plugin to render simple, animated and retina optimized pie charts + * + * @license + * @author Robert Fleischmann (http://robert-fleischmann.de) + * @version 2.1.7 + **/ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement("canvas");a.appendChild(d),"object"==typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size;var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c?!0:!1;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.trackWidth||b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f>=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(a,b){},onStep:function(a,b,c){},onStop:function(a,b){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));"string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?e.easing=jQuery.easing[e.easing]:e.easing=d.easing,"number"==typeof e.animate&&(e.animate={duration:e.animate,enabled:!0}),"boolean"!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute("data-percent")&&this.update(parseFloat(a.getAttribute("data-percent")))}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,"easyPieChart")||(d=a.extend({},b,a(this).data()),a.data(this,"easyPieChart",new c(this,d)))})}}); + +window.SEMICOLON_roundedSkillInit = function( $roundedSkillEl ){ + + $roundedSkillEl = $roundedSkillEl.filter(':not(.customjs)'); + + if( $roundedSkillEl.length < 1 ){ + return true; + } + + $roundedSkillEl.each(function(){ + let element = $(this), + elSize = element.attr('data-size') || 140, + elSpeed = element.attr('data-speed') || 2000, + elWidth = element.attr('data-width') || 4, + elColor = element.attr('data-color') || '#0093BF', + elTrackColor = element.attr('data-trackcolor') || 'rgba(0,0,0,0.04)'; + + let properties = { + size: Number( elSize ), + speed: Number( elSpeed ), + width: Number( elWidth ), + color: elColor, + trackcolor: elTrackColor + }; + + element.css({ 'width': elSize+'px', 'height': elSize+'px', 'line-height': elSize+'px' }); + + if( $('body').hasClass('device-xl') || $('body').hasClass('device-lg') ){ + element.animate({opacity:0}, 10); + let observer = new IntersectionObserver( function(entries, observer) { + entries.forEach( function(entry) { + if (entry.isIntersecting) { + if (!element.hasClass('skills-animated')) { + var t = setTimeout( function(){ element.css({opacity: 1}); }, 100 ); + SEMICOLON_runRoundedSkills( element, properties ); + element.addClass('skills-animated'); + } + observer.unobserve( entry.target ); + } + }); + }, {rootMargin: '-50px'}); + observer.observe( element[0] ); + } else { + SEMICOLON_runRoundedSkills( element, properties ); + } + }); + +}; + +window.SEMICOLON_runRoundedSkills = function( element, properties ){ + element.easyPieChart({ + size: properties.size, + animate: properties.speed, + scaleColor: false, + trackColor: properties.trackcolor, + lineWidth: properties.width, + lineCap: 'square', + barColor: properties.color + }); +}; + + + +window.scwPricingSwitcherPlugin = window.scwPricingSwitcherPlugin || {}; + +window.SEMICOLON_pricingSwitcherFn = function( checkbox, parent, pricing, defClass, actClass ) { + parent.find('.pts-left,.pts-right').removeClass( actClass ).addClass( defClass ); + pricing.find('.pts-switch-content-left,.pts-switch-content-right').addClass('d-none'); + + if( checkbox.filter(':checked').length > 0 ) { + parent.find('.pts-right').removeClass( defClass ).addClass( actClass ); + pricing.find('.pts-switch-content-right').removeClass('d-none'); + } else { + parent.find('.pts-left').removeClass( defClass ).addClass( actClass ); + pricing.find('.pts-switch-content-left').removeClass('d-none'); + } +}; + +window.SEMICOLON_pricingSwitcherInit = function( $pricingSwitcherEl ){ + + $pricingSwitcherEl = $pricingSwitcherEl.filter(':not(.customjs)'); + + if( $pricingSwitcherEl.length < 1 ){ + return true; + } + + $pricingSwitcherEl.each( function(){ + var element = $(this), + elCheck = element.find(':checkbox'), + elParent = $(this).parents('.pricing-tenure-switcher'), + elDefClass = $(this).attr('data-default-class') || 'text-muted op-05', + elActClass = $(this).attr('data-active-class') || 'fw-bold', + elPricing = $( elParent.attr('data-container') ); + + SEMICOLON_pricingSwitcherFn( elCheck, elParent, elPricing, elDefClass, elActClass ); + + elCheck.on( 'change', function(){ + SEMICOLON_pricingSwitcherFn( elCheck, elParent, elPricing, elDefClass, elActClass ); + }); + }); + +}; + + + +window.scwProgressPlugin = window.scwProgressPlugin || {}; + +window.SEMICOLON_progressInit = function( $progressEl ){ + + $progressEl = $progressEl.filter(':not(.customjs)'); + + if( $progressEl.length < 1 ){ + return true; + } + + $progressEl.each(function(){ + let element = $(this), + elBar = element.parent('li'), + elValue = elBar.attr('data-percent'); + + if( element.parent('.kv-upload-progress').length > 0 || element.children('.progress-bar').length > 0 ) { + return true; + } + + let observer = new IntersectionObserver( function(entries, observer){ + entries.forEach( function(entry){ + if (entry.isIntersecting) { + if (!elBar.hasClass('skills-animated')) { + SEMICOLON.widget.counter({ + el: element.find('.counter-instant') + }); + elBar.find('.progress').css({width: elValue + "%"}).addClass('skills-animated'); + } + observer.unobserve( entry.target ); + } + }); + }, {rootMargin: '-50px'}); + observer.observe( elBar[0] ); + }); + +}; + + + +window.scwQuantityPlugin = window.scwQuantityPlugin || {}; + +window.SEMICOLON_quantityInit = function( $quantityEl ){ + + $quantityEl = $quantityEl.filter(':not(.customjs)'); + + if( $quantityEl.length < 1 ){ + return true; + } + + $(".plus").off( 'click' ).on( 'click', function(){ + let element = $(this).parents('.quantity').find('.qty'), + elValue = element.val(), + elStep = element.attr('step') || 1, + elMax = element.attr('max'), + intRegex = /^\d+$/; + + if( elMax && ( Number(elValue) >= Number( elMax ) ) ) { return false; } + + if( intRegex.test( elValue ) ) { + let elValuePlus = Number(elValue) + Number(elStep); + element.val( elValuePlus ).change(); + } else { + element.val( Number(elStep) ).change(); + } + + return false; + }); + + $(".minus").off( 'click' ).on( 'click', function(){ + let element = $(this).parents('.quantity').find('.qty'), + elValue = element.val(), + elStep = element.attr('step') || 1, + elMin = element.attr('min'), + intRegex = /^\d+$/; + + if( !elMin || elMin < 0 ) { elMin = 1; } + + if( intRegex.test( elValue ) ) { + if( Number(elValue) > Number( elMin ) ) { + let elValueMinus = Number(elValue) - Number(elStep); + element.val( elValueMinus ).change(); + } + } else { + element.val( Number(elStep) ).change(); + } + + return false; + }); + +}; + + + +window.scwReadMorePlugin = window.scwReadMorePlugin || {}; + +window.SEMICOLON_readmoreInit = function( $readmoreEl ){ + + $readmoreEl = $readmoreEl.filter(':not(.customjs)'); + + if( $readmoreEl.length < 1 ){ + return true; + } + + $readmoreEl.each( function(){ + let element = $(this), + elHeight = element.outerHeight(), + elSize = element.attr('data-readmore-size') || '10rem', + elSpeed = element.attr('data-readmore-speed') || 500, + elTrigger = element.attr('data-readmore-trigger') || '.read-more-trigger', + elTriggerO = element.attr('data-readmore-trigger-open') || 'Read More', + elTriggerC = element.attr('data-readmore-trigger-close') || 'Read Less'; + + elTrigger = element.find( elTrigger ); + elTrigger.html( elTriggerO ); + elSpeed = Number( elSpeed ); + + element.addClass( 'read-more-wrap' ).css({ 'height': elSize, '-webkit-transition-duration': elSpeed + 'ms', 'transition-duration': elSpeed + 'ms' }).append('
'); + + let elMask = element.find('.read-more-mask'), + elMaskD = element.attr('data-readmore-mask') || 'true', + elMaskColor = element.attr('data-readmore-maskcolor') || '#FFF', + elMaskSize = element.attr('data-readmore-masksize') || '100%'; + + if( elMaskD == 'true' ) { + elMask.css({ 'height': elMaskSize, 'background-image': 'linear-gradient( '+ SEMICOLON_HEXtoRGBA( elMaskColor, 0 ) +', '+ SEMICOLON_HEXtoRGBA( elMaskColor, 1 ) +' )' }); + } else { + elMask.addClass('d-none'); + } + + elTrigger.off( 'click' ).on( 'click', function(){ + if( element.hasClass('read-more-wrap-open') ) { + element.css({ 'height': elSize }).removeClass('read-more-wrap-open'); + setTimeout( function(){ + elTrigger.html( elTriggerO ); + }, elSpeed ); + if( elMaskD == 'true' ) { + elMask.fadeIn( elSpeed ); + } + } else { + if( elTriggerC == 'false' ) { + elTrigger.remove(); + } + let elHeightN = elHeight + elTrigger.outerHeight(); + element.css({ 'height': elHeightN, 'overflow': '' }).addClass('read-more-wrap-open'); + setTimeout( function(){ + elTrigger.html( elTriggerC ); + }, elSpeed ); + if( elMaskD == 'true' ) { + elMask.fadeOut( elSpeed ); + } + } + + return false; + }); + + }); + +}; + +window.SEMICOLON_HEXtoRGBA = function( hex, op ){ + let c; + if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){ + c= hex.substring(1).split(''); + if(c.length== 3){ + c= [c[0], c[0], c[1], c[1], c[2], c[2]]; + } + c= '0x'+c.join(''); + return 'rgba('+[(c>>16)&255, (c>>8)&255, c&255].join(',')+','+op+')'; + } + console.log('Bad Hex'); +}; + + + +window.scwShapeDividerPlugin = window.scwShapeDividerPlugin || {}; + +window.SEMICOLON_shapeDividerInit = function( $shapeDividerEl ){ + + $shapeDividerEl = $shapeDividerEl.filter(':not(.customjs)'); + + if( $shapeDividerEl.length < 1 ){ + return true; + } + + $shapeDividerEl.each( function(){ + let element = $(this), + elShape = element.attr('data-shape') || 'valley', + elWidth = element.attr('data-width') || 100, + elHeight = element.attr('data-height') || 100, + elFill = element.attr('data-fill'), + elOut = element.attr('data-outside') || 'false', + elPos = element.attr('data-position') || 'top', + elId = 'shape-divider-' + Math.floor( Math.random() * 10000 ), + shape = '', + width, height, fill, + outside = ''; + + if( elWidth < 100 ) { + elWidth = 100; + } + + width = 'width: calc( '+ Number( elWidth ) +'% + 1.5px );'; + height = 'height: '+ Number( elHeight ) +'px;'; + fill = 'fill: '+elFill+';'; + + if( elOut == 'true' ) { + if( elPos == 'bottom' ) { + outside = '#'+ elId +'.shape-divider { bottom: -'+( Number( elHeight ) - 1 ) +'px; } '; + } else { + outside = '#'+ elId +'.shape-divider { top: -'+( Number( elHeight ) - 1 ) +'px; } '; + } + } + + let css = outside + '#'+ elId +'.shape-divider svg { '+ width + height +' } #'+ elId +'.shape-divider .shape-divider-fill { '+ fill +' }', + head = document.head || document.getElementsByTagName('head')[0], + style = document.createElement('style'); + + head.appendChild(style); + + style.type = 'text/css'; + style.appendChild(document.createTextNode(css)); + + element.attr( 'id', elId ); + + switch( elShape ){ + + case 'valley': + shape = ''; + break; + + case 'valley-2': + shape = ''; + break; + + case 'valley-3': + shape = ''; + break; + + case 'mountain': + shape = ''; + break; + + case 'mountain-2': + shape = ''; + break; + + case 'mountain-3': + shape = ''; + break; + + case 'mountain-4': + shape = ''; + break; + + case 'mountain-5': + shape = ''; + break; + + case 'mountains': + shape = ''; + break; + + case 'mountains-2': + shape = ''; + break; + + case 'mountains-3': + shape = ''; + break; + + case 'mountains-4': + shape = ''; + break; + + case 'plataeu': + shape = ''; + break; + + case 'plataeu-2': + shape = ''; + break; + + case 'hills': + shape = ''; + break; + + case 'hills-2': + shape = ''; + break; + + case 'hills-3': + shape = ''; + break; + + case 'hills-4': + shape = ''; + break; + + case 'cloud': + shape = ''; + break; + + case 'cloud-2': + shape = ''; + break; + + case 'cloud-3': + shape = ''; + break; + + case 'wave': + shape = ''; + break; + + case 'wave-2': + shape = ''; + break; + + case 'wave-3': + shape = ''; + break; + + case 'wave-4': + shape = ''; + break; + + case 'wave-5': + shape = ''; + break; + + case 'wave-6': + shape = ''; + break; + + case 'slant': + shape = ''; + break; + + case 'slant-2': + shape = ''; + break; + + case 'slant-3': + shape = ''; + break; + + case 'rounded': + shape = ''; + break; + + case 'rounded-2': + shape = ''; + break; + + case 'rounded-3': + shape = ''; + break; + + case 'rounded-4': + shape = ''; + break; + + case 'rounded-5': + shape = ''; + break; + + case 'triangle': + shape = ''; + break; + + case 'drops': + shape = ''; + break; + + case 'cliff': + shape = ''; + break; + + case 'zigzag': + shape = ''; + break; + + case 'illusion': + shape = ''; + break; + + default: + shape = ''; + break; + + } + + element.html( shape ); + element.find('svg').addClass( 'op-ts' ); + + setTimeout( function(){ + element.find('svg').addClass( 'op-1' ); + }, 500); + + }); + +}; + + + +/*! + * Theia Sticky Sidebar v1.7.0 + * https://github.com/WeCodePixels/theia-sticky-sidebar + */ +!function(i){i.fn.scwStickySidebar=function(t){function e(t,e){var a=o(t,e);a||(console.log("TSS: Body width smaller than options.minWidth. Init is delayed."),i(document).on("scroll."+t.namespace,function(t,e){return function(a){var n=o(t,e);n&&i(this).unbind(a)}}(t,e)),i(window).on("resize."+t.namespace,function(t,e){return function(a){var n=o(t,e);n&&i(this).unbind(a)}}(t,e)))}function o(t,e){return t.initialized===!0||!(i("body").width().scwStickySidebar:after {content: ""; display: table; clear: both;}')),e.each(function(){function e(){a.fixedScrollTop=0,a.sidebar.css({"min-height":"1px"}),a.stickySidebar.css({position:"static",width:"",transform:"none"})}function o(t){var e=t.height();return t.children().each(function(){e=Math.max(e,i(this).height())}),e}var a={};if(a.sidebar=i(this),a.options=t||{},a.container=i(a.options.containerSelector),0==a.container.length&&(a.container=a.sidebar.parent()),a.sidebar.parents().css("-webkit-transform","none"),a.sidebar.css({position:a.options.defaultPosition,overflow:"visible","-webkit-box-sizing":"border-box","-moz-box-sizing":"border-box","box-sizing":"border-box"}),a.stickySidebar=a.sidebar.find(".scwStickySidebar"),0==a.stickySidebar.length){var s=/(?:text|application)\/(?:x-)?(?:javascript|ecmascript)/i;a.sidebar.find("script").filter(function(i,t){return 0===t.type.length||t.type.match(s)}).remove(),a.stickySidebar=i("
").addClass("scwStickySidebar").append(a.sidebar.children()),a.sidebar.append(a.stickySidebar)}a.marginBottom=parseInt(a.sidebar.css("margin-bottom")),a.paddingTop=parseInt(a.sidebar.css("padding-top")),a.paddingBottom=parseInt(a.sidebar.css("padding-bottom"));var r=a.stickySidebar.offset().top,d=a.stickySidebar.outerHeight();a.stickySidebar.css("padding-top",1),a.stickySidebar.css("padding-bottom",1),r-=a.stickySidebar.offset().top,d=a.stickySidebar.outerHeight()-d-r,0==r?(a.stickySidebar.css("padding-top",0),a.stickySidebarPaddingTop=0):a.stickySidebarPaddingTop=1,0==d?(a.stickySidebar.css("padding-bottom",0),a.stickySidebarPaddingBottom=0):a.stickySidebarPaddingBottom=1,a.previousScrollTop=null,a.fixedScrollTop=0,e(),a.onScroll=function(a){if(a.stickySidebar.is(":visible")){if(i("body").width()a.container.width())return void e()}var r=i(document).scrollTop(),d="static";if(r>=a.sidebar.offset().top+(a.paddingTop-a.options.additionalMarginTop)){var c,p=a.paddingTop+t.additionalMarginTop,b=a.paddingBottom+a.marginBottom+t.additionalMarginBottom,l=a.sidebar.offset().top,f=a.sidebar.offset().top+o(a.container),h=0+t.additionalMarginTop,g=a.stickySidebar.outerHeight()+p+b0?Math.min(y,h):Math.max(y,c-a.stickySidebar.outerHeight()),y=Math.max(y,u),y=Math.min(y,S-a.stickySidebar.outerHeight());var k=a.container.height()==a.stickySidebar.outerHeight();d=(k||y!=h)&&(k||y!=c-a.stickySidebar.outerHeight())?r+y-a.sidebar.offset().top-a.paddingTop<=t.additionalMarginTop?"static":"absolute":"fixed"}if("fixed"==d){var v=i(document).scrollLeft();a.stickySidebar.css({position:"fixed",width:n(a.stickySidebar)+"px",transform:"translateY("+y+"px)",left:a.sidebar.offset().left+parseInt(a.sidebar.css("padding-left"))-v+"px",top:"0px"})}else if("absolute"==d){var x={};"absolute"!=a.stickySidebar.css("position")&&(x.position="absolute",x.transform="translateY("+(r+y-a.sidebar.offset().top-a.stickySidebarPaddingTop-a.stickySidebarPaddingBottom)+"px)",x.top="0px"),x.width=n(a.stickySidebar)+"px",x.left="",a.stickySidebar.css(x)}else"static"==d&&e();"static"!=d&&1==a.options.updateSidebarHeight&&a.sidebar.css({"min-height":a.stickySidebar.outerHeight()+a.stickySidebar.offset().top-a.sidebar.offset().top+a.paddingBottom}),a.previousScrollTop=r}},a.onScroll(a),i(document).on("scroll."+a.options.namespace,function(i){return function(){i.onScroll(i)}}(a)),i(window).on("resize."+a.options.namespace,function(i){return function(){i.stickySidebar.css({position:"static"}),i.onScroll(i)}}(a)),"undefined"!=typeof ResizeSensor&&new ResizeSensor(a.stickySidebar[0],function(i){return function(){i.onScroll(i)}}(a))})}function n(i){var t;try{t=i[0].getBoundingClientRect().width}catch(i){}return"undefined"==typeof t&&(t=i.width()),t}var s={containerSelector:"",additionalMarginTop:0,additionalMarginBottom:0,updateSidebarHeight:!0,minWidth:0,disableOnResponsiveLayouts:!0,sidebarBehavior:"modern",defaultPosition:"relative",namespace:"TSS"};return t=i.extend(s,t),t.additionalMarginTop=parseInt(t.additionalMarginTop)||0,t.additionalMarginBottom=parseInt(t.additionalMarginBottom)||0,e(t,this),this}}(jQuery); +!function(){var e=function(t,i){function s(){this.q=[],this.add=function(e){this.q.push(e)};var e,t;this.call=function(){for(e=0,t=this.q.length;e
',e.appendChild(e.resizeSensor),{fixed:1,absolute:1}[o(e,"position")]||(e.style.position="relative");var d,r,l=e.resizeSensor.childNodes[0],c=l.childNodes[0],h=e.resizeSensor.childNodes[1],a=(h.childNodes[0],function(){c.style.width=l.offsetWidth+10+"px",c.style.height=l.offsetHeight+10+"px",l.scrollLeft=l.scrollWidth,l.scrollTop=l.scrollHeight,h.scrollLeft=h.scrollWidth,h.scrollTop=h.scrollHeight,d=e.offsetWidth,r=e.offsetHeight});a();var f=function(){e.resizedAttached&&e.resizedAttached.call()},u=function(e,t,i){e.attachEvent?e.attachEvent("on"+t,i):e.addEventListener(t,i)},p=function(){e.offsetWidth==d&&e.offsetHeight==r||f(),a()};u(l,"scroll",p),u(h,"scroll",p)}var d=Object.prototype.toString.call(t),r="[object Array]"===d||"[object NodeList]"===d||"[object HTMLCollection]"===d||"undefined"!=typeof jQuery&&t instanceof jQuery||"undefined"!=typeof Elements&&t instanceof Elements;if(r)for(var l=0,c=t.length;l
'); + } else { + $(form).find('.icon-email2').removeClass('icon-email2').addClass('icon-line-loader icon-spin'); + } + + $(form).ajaxSubmit({ + target: elResult, + dataType: 'json', + resetForm: true, + success: function( data ) { + if( elLoader == 'button' ) { + defButton.html( defButtonText ); + } else { + $(form).find('.icon-line-loader').removeClass('icon-line-loader icon-spin').addClass('icon-email2'); + } + if( data.alert != 'error' && elRedirect ){ + window.location.replace( elRedirect ); + return true; + } + if( elAlert == 'inline' ) { + if( data.alert == 'error' ) { + alertType = 'alert-danger'; + } else { + alertType = 'alert-success'; + } + + elResult.addClass( 'alert ' + alertType ).html( data.message ).slideDown( 400 ); + } else { + elResult.attr( 'data-notify-type', data.alert ).attr( 'data-notify-msg', data.message ).html(''); + SEMICOLON.widget.notifications({ el: elResult }); + } + } + }); + } + }); + + }); + +}; + + + +/** + * Swiper 6.8.1 + * Most modern mobile touch slider and framework with hardware accelerated transitions + * https://swiperjs.com + * + * Copyright 2014-2021 Vladimir Kharlampidi + * + * Released under the MIT License + * + * Released on: August 3, 2021 + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Swiper=t()}(this,(function(){"use strict";function e(e,t){for(var a=0;a0&&i(e[s],t[s])}))}var s={body:{},addEventListener:function(){},removeEventListener:function(){},activeElement:{blur:function(){},nodeName:""},querySelector:function(){return null},querySelectorAll:function(){return[]},getElementById:function(){return null},createEvent:function(){return{initEvent:function(){}}},createElement:function(){return{children:[],childNodes:[],style:{},setAttribute:function(){},getElementsByTagName:function(){return[]}}},createElementNS:function(){return{}},importNode:function(){return null},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""}};function r(){var e="undefined"!=typeof document?document:{};return i(e,s),e}var n={document:s,navigator:{userAgent:""},location:{hash:"",host:"",hostname:"",href:"",origin:"",pathname:"",protocol:"",search:""},history:{replaceState:function(){},pushState:function(){},go:function(){},back:function(){}},CustomEvent:function(){return this},addEventListener:function(){},removeEventListener:function(){},getComputedStyle:function(){return{getPropertyValue:function(){return""}}},Image:function(){},Date:function(){},screen:{},setTimeout:function(){},clearTimeout:function(){},matchMedia:function(){return{}},requestAnimationFrame:function(e){return"undefined"==typeof setTimeout?(e(),null):setTimeout(e,0)},cancelAnimationFrame:function(e){"undefined"!=typeof setTimeout&&clearTimeout(e)}};function l(){var e="undefined"!=typeof window?window:{};return i(e,n),e}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function d(e,t){return(d=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function p(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function u(e,t,a){return(u=p()?Reflect.construct:function(e,t,a){var i=[null];i.push.apply(i,t);var s=new(Function.bind.apply(e,i));return a&&d(s,a.prototype),s}).apply(null,arguments)}function c(e){var t="function"==typeof Map?new Map:void 0;return(c=function(e){if(null===e||(a=e,-1===Function.toString.call(a).indexOf("[native code]")))return e;var a;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,i)}function i(){return u(e,arguments,o(this).constructor)}return i.prototype=Object.create(e.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}),d(i,e)})(e)}var h=function(e){var t,a;function i(t){var a,i,s;return a=e.call.apply(e,[this].concat(t))||this,i=function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(a),s=i.__proto__,Object.defineProperty(i,"__proto__",{get:function(){return s},set:function(e){s.__proto__=e}}),a}return a=e,(t=i).prototype=Object.create(a.prototype),t.prototype.constructor=t,t.__proto__=a,i}(c(Array));function v(e){void 0===e&&(e=[]);var t=[];return e.forEach((function(e){Array.isArray(e)?t.push.apply(t,v(e)):t.push(e)})),t}function f(e,t){return Array.prototype.filter.call(e,t)}function m(e,t){var a=l(),i=r(),s=[];if(!t&&e instanceof h)return e;if(!e)return new h(s);if("string"==typeof e){var n=e.trim();if(n.indexOf("<")>=0&&n.indexOf(">")>=0){var o="div";0===n.indexOf("0})).length>0},toggleClass:function(){for(var e=arguments.length,t=new Array(e),a=0;a=0;h-=1){var v=c[h];r&&v.listener===r||r&&v.listener&&v.listener.dom7proxy&&v.listener.dom7proxy===r?(u.removeEventListener(d,v.proxyListener,n),c.splice(h,1)):r||(u.removeEventListener(d,v.proxyListener,n),c.splice(h,1))}}return this},trigger:function(){for(var e=l(),t=arguments.length,a=new Array(t),i=0;i0})),p.dispatchEvent(u),p.dom7EventData=[],delete p.dom7EventData}}return this},transitionEnd:function(e){var t=this;return e&&t.on("transitionend",(function a(i){i.target===this&&(e.call(this,i),t.off("transitionend",a))})),this},outerWidth:function(e){if(this.length>0){if(e){var t=this.styles();return this[0].offsetWidth+parseFloat(t.getPropertyValue("margin-right"))+parseFloat(t.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},outerHeight:function(e){if(this.length>0){if(e){var t=this.styles();return this[0].offsetHeight+parseFloat(t.getPropertyValue("margin-top"))+parseFloat(t.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},styles:function(){var e=l();return this[0]?e.getComputedStyle(this[0],null):{}},offset:function(){if(this.length>0){var e=l(),t=r(),a=this[0],i=a.getBoundingClientRect(),s=t.body,n=a.clientTop||s.clientTop||0,o=a.clientLeft||s.clientLeft||0,d=a===e?e.scrollY:a.scrollTop,p=a===e?e.scrollX:a.scrollLeft;return{top:i.top+d-n,left:i.left+p-o}}return null},css:function(e,t){var a,i=l();if(1===arguments.length){if("string"!=typeof e){for(a=0;at-1)return m([]);if(e<0){var a=t+e;return m(a<0?[]:[this[a]])}return m([this[e]])},append:function(){for(var e,t=r(),a=0;a=0;a-=1)this[t].insertBefore(s.childNodes[a],this[t].childNodes[0])}else if(e instanceof h)for(a=0;a0?e?this[0].nextElementSibling&&m(this[0].nextElementSibling).is(e)?m([this[0].nextElementSibling]):m([]):this[0].nextElementSibling?m([this[0].nextElementSibling]):m([]):m([])},nextAll:function(e){var t=[],a=this[0];if(!a)return m([]);for(;a.nextElementSibling;){var i=a.nextElementSibling;e?m(i).is(e)&&t.push(i):t.push(i),a=i}return m(t)},prev:function(e){if(this.length>0){var t=this[0];return e?t.previousElementSibling&&m(t.previousElementSibling).is(e)?m([t.previousElementSibling]):m([]):t.previousElementSibling?m([t.previousElementSibling]):m([])}return m([])},prevAll:function(e){var t=[],a=this[0];if(!a)return m([]);for(;a.previousElementSibling;){var i=a.previousElementSibling;e?m(i).is(e)&&t.push(i):t.push(i),a=i}return m(t)},parent:function(e){for(var t=[],a=0;a6&&(i=i.split(", ").map((function(e){return e.replace(",",".")})).join(", ")),s=new r.WebKitCSSMatrix("none"===i?"":i)):a=(s=n.MozTransform||n.OTransform||n.MsTransform||n.msTransform||n.transform||n.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,")).toString().split(","),"x"===t&&(i=r.WebKitCSSMatrix?s.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=r.WebKitCSSMatrix?s.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0}function C(e){return"object"==typeof e&&null!==e&&e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function S(e){return"undefined"!=typeof window&&void 0!==window.HTMLElement?e instanceof HTMLElement:e&&(1===e.nodeType||11===e.nodeType)}function M(){for(var e=Object(arguments.length<=0?void 0:arguments[0]),t=["__proto__","constructor","prototype"],a=1;a=0,observer:"MutationObserver"in e||"WebkitMutationObserver"in e,passiveListener:function(){var t=!1;try{var a=Object.defineProperty({},"passive",{get:function(){t=!0}});e.addEventListener("testPassiveListener",null,a)}catch(e){}return t}(),gestures:"ongesturestart"in e}}()),g}function L(e){return void 0===e&&(e={}),b||(b=function(e){var t=(void 0===e?{}:e).userAgent,a=$(),i=l(),s=i.navigator.platform,r=t||i.navigator.userAgent,n={ios:!1,android:!1},o=i.screen.width,d=i.screen.height,p=r.match(/(Android);?[\s\/]+([\d.]+)?/),u=r.match(/(iPad).*OS\s([\d_]+)/),c=r.match(/(iPod)(.*OS\s([\d_]+))?/),h=!u&&r.match(/(iPhone\sOS|iOS)\s([\d_]+)/),v="Win32"===s,f="MacIntel"===s;return!u&&f&&a.touch&&["1024x1366","1366x1024","834x1194","1194x834","834x1112","1112x834","768x1024","1024x768","820x1180","1180x820","810x1080","1080x810"].indexOf(o+"x"+d)>=0&&((u=r.match(/(Version)\/([\d.]+)/))||(u=[0,1,"13_0_0"]),f=!1),p&&!v&&(n.os="android",n.android=!0),(u||h||c)&&(n.os="ios",n.ios=!0),n}(e)),b}function I(){return w||(w=function(){var e,t=l();return{isEdge:!!t.navigator.userAgent.match(/Edge/g),isSafari:(e=t.navigator.userAgent.toLowerCase(),e.indexOf("safari")>=0&&e.indexOf("chrome")<0&&e.indexOf("android")<0),isWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(t.navigator.userAgent)}}()),w}Object.keys(y).forEach((function(e){Object.defineProperty(m.fn,e,{value:y[e],writable:!0})}));var O={name:"resize",create:function(){var e=this;M(e,{resize:{observer:null,createObserver:function(){e&&!e.destroyed&&e.initialized&&(e.resize.observer=new ResizeObserver((function(t){var a=e.width,i=e.height,s=a,r=i;t.forEach((function(t){var a=t.contentBoxSize,i=t.contentRect,n=t.target;n&&n!==e.el||(s=i?i.width:(a[0]||a).inlineSize,r=i?i.height:(a[0]||a).blockSize)})),s===a&&r===i||e.resize.resizeHandler()})),e.resize.observer.observe(e.el))},removeObserver:function(){e.resize.observer&&e.resize.observer.unobserve&&e.el&&(e.resize.observer.unobserve(e.el),e.resize.observer=null)},resizeHandler:function(){e&&!e.destroyed&&e.initialized&&(e.emit("beforeResize"),e.emit("resize"))},orientationChangeHandler:function(){e&&!e.destroyed&&e.initialized&&e.emit("orientationchange")}}})},on:{init:function(e){var t=l();e.params.resizeObserver&&void 0!==l().ResizeObserver?e.resize.createObserver():(t.addEventListener("resize",e.resize.resizeHandler),t.addEventListener("orientationchange",e.resize.orientationChangeHandler))},destroy:function(e){var t=l();e.resize.removeObserver(),t.removeEventListener("resize",e.resize.resizeHandler),t.removeEventListener("orientationchange",e.resize.orientationChangeHandler)}}},A={attach:function(e,t){void 0===t&&(t={});var a=l(),i=this,s=new(a.MutationObserver||a.WebkitMutationObserver)((function(e){if(1!==e.length){var t=function(){i.emit("observerUpdate",e[0])};a.requestAnimationFrame?a.requestAnimationFrame(t):a.setTimeout(t,0)}else i.emit("observerUpdate",e[0])}));s.observe(e,{attributes:void 0===t.attributes||t.attributes,childList:void 0===t.childList||t.childList,characterData:void 0===t.characterData||t.characterData}),i.observer.observers.push(s)},init:function(){var e=this;if(e.support.observer&&e.params.observer){if(e.params.observeParents)for(var t=e.$el.parents(),a=0;a0||s.isTouched&&s.isMoved))){!!n.noSwipingClass&&""!==n.noSwipingClass&&d.target&&d.target.shadowRoot&&e.path&&e.path[0]&&(p=m(e.path[0]));var u=n.noSwipingSelector?n.noSwipingSelector:"."+n.noSwipingClass,c=!(!d.target||!d.target.shadowRoot);if(n.noSwiping&&(c?function(e,t){return void 0===t&&(t=this),function t(a){return a&&a!==r()&&a!==l()?(a.assignedSlot&&(a=a.assignedSlot),a.closest(e)||t(a.getRootNode().host)):null}(t)}(u,d.target):p.closest(u)[0]))t.allowClick=!0;else if(!n.swipeHandler||p.closest(n.swipeHandler)[0]){o.currentX="touchstart"===d.type?d.targetTouches[0].pageX:d.pageX,o.currentY="touchstart"===d.type?d.targetTouches[0].pageY:d.pageY;var h=o.currentX,v=o.currentY,f=n.edgeSwipeDetection||n.iOSEdgeSwipeDetection,g=n.edgeSwipeThreshold||n.iOSEdgeSwipeThreshold;if(f&&(h<=g||h>=i.innerWidth-g)){if("prevent"!==f)return;e.preventDefault()}if(M(s,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),o.startX=h,o.startY=v,s.touchStartTime=x(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,n.threshold>0&&(s.allowThresholdMove=!1),"touchstart"!==d.type){var b=!0;p.is(s.focusableElements)&&(b=!1),a.activeElement&&m(a.activeElement).is(s.focusableElements)&&a.activeElement!==p[0]&&a.activeElement.blur();var w=b&&t.allowTouchMove&&n.touchStartPreventDefault;!n.touchStartForcePreventDefault&&!w||p[0].isContentEditable||d.preventDefault()}t.emit("touchStart",d)}}}}function G(e){var t=r(),a=this,i=a.touchEventsData,s=a.params,n=a.touches,l=a.rtlTranslate;if(a.enabled){var o=e;if(o.originalEvent&&(o=o.originalEvent),i.isTouched){if(!i.isTouchEvent||"touchmove"===o.type){var d="touchmove"===o.type&&o.targetTouches&&(o.targetTouches[0]||o.changedTouches[0]),p="touchmove"===o.type?d.pageX:o.pageX,u="touchmove"===o.type?d.pageY:o.pageY;if(o.preventedByNestedSwiper)return n.startX=p,void(n.startY=u);if(!a.allowTouchMove)return a.allowClick=!1,void(i.isTouched&&(M(n,{startX:p,startY:u,currentX:p,currentY:u}),i.touchStartTime=x()));if(i.isTouchEvent&&s.touchReleaseOnEdges&&!s.loop)if(a.isVertical()){if(un.startY&&a.translate>=a.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else if(pn.startX&&a.translate>=a.minTranslate())return;if(i.isTouchEvent&&t.activeElement&&o.target===t.activeElement&&m(o.target).is(i.focusableElements))return i.isMoved=!0,void(a.allowClick=!1);if(i.allowTouchCallbacks&&a.emit("touchMove",o),!(o.targetTouches&&o.targetTouches.length>1)){n.currentX=p,n.currentY=u;var c=n.currentX-n.startX,h=n.currentY-n.startY;if(!(a.params.threshold&&Math.sqrt(Math.pow(c,2)+Math.pow(h,2))=25&&(v=180*Math.atan2(Math.abs(h),Math.abs(c))/Math.PI,i.isScrolling=a.isHorizontal()?v>s.touchAngle:90-v>s.touchAngle);if(i.isScrolling&&a.emit("touchMoveOpposite",o),void 0===i.startMoving&&(n.currentX===n.startX&&n.currentY===n.startY||(i.startMoving=!0)),i.isScrolling)i.isTouched=!1;else if(i.startMoving){a.allowClick=!1,!s.cssMode&&o.cancelable&&o.preventDefault(),s.touchMoveStopPropagation&&!s.nested&&o.stopPropagation(),i.isMoved||(s.loop&&a.loopFix(),i.startTranslate=a.getTranslate(),a.setTransition(0),a.animating&&a.$wrapperEl.trigger("webkitTransitionEnd transitionend"),i.allowMomentumBounce=!1,!s.grabCursor||!0!==a.allowSlideNext&&!0!==a.allowSlidePrev||a.setGrabCursor(!0),a.emit("sliderFirstMove",o)),a.emit("sliderMove",o),i.isMoved=!0;var f=a.isHorizontal()?c:h;n.diff=f,f*=s.touchRatio,l&&(f=-f),a.swipeDirection=f>0?"prev":"next",i.currentTranslate=f+i.startTranslate;var g=!0,b=s.resistanceRatio;if(s.touchReleaseOnEdges&&(b=0),f>0&&i.currentTranslate>a.minTranslate()?(g=!1,s.resistance&&(i.currentTranslate=a.minTranslate()-1+Math.pow(-a.minTranslate()+i.startTranslate+f,b))):f<0&&i.currentTranslatei.startTranslate&&(i.currentTranslate=i.startTranslate),a.allowSlidePrev||a.allowSlideNext||(i.currentTranslate=i.startTranslate),s.threshold>0){if(!(Math.abs(f)>s.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,n.startX=n.currentX,n.startY=n.currentY,i.currentTranslate=i.startTranslate,void(n.diff=a.isHorizontal()?n.currentX-n.startX:n.currentY-n.startY)}s.followFinger&&!s.cssMode&&((s.freeMode||s.watchSlidesProgress||s.watchSlidesVisibility)&&(a.updateActiveIndex(),a.updateSlidesClasses()),s.freeMode&&(0===i.velocities.length&&i.velocities.push({position:n[a.isHorizontal()?"startX":"startY"],time:i.touchStartTime}),i.velocities.push({position:n[a.isHorizontal()?"currentX":"currentY"],time:x()})),a.updateProgress(i.currentTranslate),a.setTranslate(i.currentTranslate))}}}}}else i.startMoving&&i.isScrolling&&a.emit("touchMoveOpposite",o)}}function B(e){var t=this,a=t.touchEventsData,i=t.params,s=t.touches,r=t.rtlTranslate,n=t.$wrapperEl,l=t.slidesGrid,o=t.snapGrid;if(t.enabled){var d=e;if(d.originalEvent&&(d=d.originalEvent),a.allowTouchCallbacks&&t.emit("touchEnd",d),a.allowTouchCallbacks=!1,!a.isTouched)return a.isMoved&&i.grabCursor&&t.setGrabCursor(!1),a.isMoved=!1,void(a.startMoving=!1);i.grabCursor&&a.isMoved&&a.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);var p,u=x(),c=u-a.touchStartTime;if(t.allowClick&&(t.updateClickedSlide(d),t.emit("tap click",d),c<300&&u-a.lastClickTime<300&&t.emit("doubleTap doubleClick",d)),a.lastClickTime=x(),E((function(){t.destroyed||(t.allowClick=!0)})),!a.isTouched||!a.isMoved||!t.swipeDirection||0===s.diff||a.currentTranslate===a.startTranslate)return a.isTouched=!1,a.isMoved=!1,void(a.startMoving=!1);if(a.isTouched=!1,a.isMoved=!1,a.startMoving=!1,p=i.followFinger?r?t.translate:-t.translate:-a.currentTranslate,!i.cssMode)if(i.freeMode){if(p<-t.minTranslate())return void t.slideTo(t.activeIndex);if(p>-t.maxTranslate())return void(t.slides.length1){var h=a.velocities.pop(),v=a.velocities.pop(),f=h.position-v.position,m=h.time-v.time;t.velocity=f/m,t.velocity/=2,Math.abs(t.velocity)150||x()-h.time>300)&&(t.velocity=0)}else t.velocity=0;t.velocity*=i.freeModeMomentumVelocityRatio,a.velocities.length=0;var g=1e3*i.freeModeMomentumRatio,b=t.velocity*g,w=t.translate+b;r&&(w=-w);var y,T,C=!1,S=20*Math.abs(t.velocity)*i.freeModeMomentumBounceRatio;if(wt.minTranslate())i.freeModeMomentumBounce?(w-t.minTranslate()>S&&(w=t.minTranslate()+S),y=t.minTranslate(),C=!0,a.allowMomentumBounce=!0):w=t.minTranslate(),i.loop&&i.centeredSlides&&(T=!0);else if(i.freeModeSticky){for(var M,z=0;z-w){M=z;break}w=-(w=Math.abs(o[M]-w)=i.longSwipesMs)&&(t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses())}else{for(var $=0,L=t.slidesSizesGrid[0],I=0;I=l[I]&&p=l[I]&&($=I,L=l[l.length-1]-l[l.length-2])}var A=(p-l[$])/L,D=$i.longSwipesMs){if(!i.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(A>=i.longSwipesRatio?t.slideTo($+D):t.slideTo($)),"prev"===t.swipeDirection&&(A>1-i.longSwipesRatio?t.slideTo($+D):t.slideTo($))}else{if(!i.shortSwipes)return void t.slideTo(t.activeIndex);t.navigation&&(d.target===t.navigation.nextEl||d.target===t.navigation.prevEl)?d.target===t.navigation.nextEl?t.slideTo($+D):t.slideTo($):("next"===t.swipeDirection&&t.slideTo($+D),"prev"===t.swipeDirection&&t.slideTo($))}}}}function H(){var e=this,t=e.params,a=e.el;if(!a||0!==a.offsetWidth){t.breakpoints&&e.setBreakpoint();var i=e.allowSlideNext,s=e.allowSlidePrev,r=e.snapGrid;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses(),("auto"===t.slidesPerView||t.slidesPerView>1)&&e.isEnd&&!e.isBeginning&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0),e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.run(),e.allowSlidePrev=s,e.allowSlideNext=i,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}}function R(e){var t=this;t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function X(){var e=this,t=e.wrapperEl,a=e.rtlTranslate;if(e.enabled){e.previousTranslate=e.translate,e.isHorizontal()?e.translate=a?t.scrollWidth-t.offsetWidth-t.scrollLeft:-t.scrollLeft:e.translate=-t.scrollTop,-0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();var i=e.maxTranslate()-e.minTranslate();(0===i?0:(e.translate-e.minTranslate())/i)!==e.progress&&e.updateProgress(a?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}}var Y=!1;function V(){}var W={init:!0,direction:"horizontal",touchEventsTarget:"container",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!1,nested:!1,createElements:!1,enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,freeMode:!1,freeModeMomentum:!0,freeModeMomentumRatio:1,freeModeMomentumBounce:!0,freeModeMomentumBounceRatio:1,freeModeMomentumVelocityRatio:1,freeModeSticky:!1,freeModeMinimumVelocity:.02,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerColumn:1,slidesPerColumnFill:"column",slidesPerGroup:1,slidesPerGroupSkip:0,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!1,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:0,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,watchSlidesVisibility:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopFillGroupWithBlank:!1,loopPreventsSlide:!0,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,containerModifierClass:"swiper-container-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-invisible-blank",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",runCallbacksOnInit:!0,_emitClasses:!1},F={modular:{useParams:function(e){var t=this;t.modules&&Object.keys(t.modules).forEach((function(a){var i=t.modules[a];i.params&&M(e,i.params)}))},useModules:function(e){void 0===e&&(e={});var t=this;t.modules&&Object.keys(t.modules).forEach((function(a){var i=t.modules[a],s=e[a]||{};i.on&&t.on&&Object.keys(i.on).forEach((function(e){t.on(e,i.on[e])})),i.create&&i.create.bind(t)(s)}))}},eventsEmitter:{on:function(e,t,a){var i=this;if("function"!=typeof t)return i;var s=a?"unshift":"push";return e.split(" ").forEach((function(e){i.eventsListeners[e]||(i.eventsListeners[e]=[]),i.eventsListeners[e][s](t)})),i},once:function(e,t,a){var i=this;if("function"!=typeof t)return i;function s(){i.off(e,s),s.__emitterProxy&&delete s.__emitterProxy;for(var a=arguments.length,r=new Array(a),n=0;n=0&&t.eventsAnyListeners.splice(a,1),t},off:function(e,t){var a=this;return a.eventsListeners?(e.split(" ").forEach((function(e){void 0===t?a.eventsListeners[e]=[]:a.eventsListeners[e]&&a.eventsListeners[e].forEach((function(i,s){(i===t||i.__emitterProxy&&i.__emitterProxy===t)&&a.eventsListeners[e].splice(s,1)}))})),a):a},emit:function(){var e,t,a,i=this;if(!i.eventsListeners)return i;for(var s=arguments.length,r=new Array(s),n=0;n=0&&(w=parseFloat(w.replace("%",""))/100*r),e.virtualSize=-w,n?p.css({marginLeft:"",marginBottom:"",marginTop:""}):p.css({marginRight:"",marginBottom:"",marginTop:""}),i.slidesPerColumn>1&&(T=Math.floor(u/i.slidesPerColumn)===u/e.params.slidesPerColumn?u:Math.ceil(u/i.slidesPerColumn)*i.slidesPerColumn,"auto"!==i.slidesPerView&&"row"===i.slidesPerColumnFill&&(T=Math.max(T,i.slidesPerView*i.slidesPerColumn)));for(var S,z,P,k=i.slidesPerColumn,$=T/k,L=Math.floor(u/i.slidesPerColumn),I=0;I1){var A=void 0,D=void 0,N=void 0;if("row"===i.slidesPerColumnFill&&i.slidesPerGroup>1){var G=Math.floor(I/(i.slidesPerGroup*i.slidesPerColumn)),B=I-i.slidesPerColumn*i.slidesPerGroup*G,H=0===G?i.slidesPerGroup:Math.min(Math.ceil((u-G*k*i.slidesPerGroup)/k),i.slidesPerGroup);A=(D=B-(N=Math.floor(B/H))*H+G*i.slidesPerGroup)+N*T/k,O.css({"-webkit-box-ordinal-group":A,"-moz-box-ordinal-group":A,"-ms-flex-order":A,"-webkit-order":A,order:A})}else"column"===i.slidesPerColumnFill?(N=I-(D=Math.floor(I/k))*k,(D>L||D===L&&N===k-1)&&(N+=1)>=k&&(N=0,D+=1)):D=I-(N=Math.floor(I/$))*$;O.css(t("margin-top"),0!==N?i.spaceBetween&&i.spaceBetween+"px":"")}if("none"!==O.css("display")){if("auto"===i.slidesPerView){var R=getComputedStyle(O[0]),X=O[0].style.transform,Y=O[0].style.webkitTransform;if(X&&(O[0].style.transform="none"),Y&&(O[0].style.webkitTransform="none"),i.roundLengths)C=e.isHorizontal()?O.outerWidth(!0):O.outerHeight(!0);else{var V=a(R,"width"),W=a(R,"padding-left"),F=a(R,"padding-right"),_=a(R,"margin-left"),q=a(R,"margin-right"),j=R.getPropertyValue("box-sizing");if(j&&"border-box"===j)C=V+_+q;else{var U=O[0],K=U.clientWidth;C=V+W+F+_+q+(U.offsetWidth-K)}}X&&(O[0].style.transform=X),Y&&(O[0].style.webkitTransform=Y),i.roundLengths&&(C=Math.floor(C))}else C=(r-(i.slidesPerView-1)*w)/i.slidesPerView,i.roundLengths&&(C=Math.floor(C)),p[I]&&(p[I].style[t("width")]=C+"px");p[I]&&(p[I].swiperSlideSize=C),v.push(C),i.centeredSlides?(y=y+C/2+E/2+w,0===E&&0!==I&&(y=y-r/2-w),0===I&&(y=y-r/2-w),Math.abs(y)<.001&&(y=0),i.roundLengths&&(y=Math.floor(y)),x%i.slidesPerGroup==0&&c.push(y),h.push(y)):(i.roundLengths&&(y=Math.floor(y)),(x-Math.min(e.params.slidesPerGroupSkip,x))%e.params.slidesPerGroup==0&&c.push(y),h.push(y),y=y+C+w),e.virtualSize+=C+w,E=C,x+=1}}if(e.virtualSize=Math.max(e.virtualSize,r)+m,n&&l&&("slide"===i.effect||"coverflow"===i.effect)&&s.css({width:e.virtualSize+i.spaceBetween+"px"}),i.setWrapperSize)s.css(((z={})[t("width")]=e.virtualSize+i.spaceBetween+"px",z));if(i.slidesPerColumn>1)if(e.virtualSize=(C+i.spaceBetween)*T,e.virtualSize=Math.ceil(e.virtualSize/i.slidesPerColumn)-i.spaceBetween,s.css(((P={})[t("width")]=e.virtualSize+i.spaceBetween+"px",P)),i.centeredSlides){S=[];for(var Z=0;Z1&&c.push(e.virtualSize-r)}if(0===c.length&&(c=[0]),0!==i.spaceBetween){var te,ae=e.isHorizontal()&&n?"marginLeft":t("marginRight");p.filter((function(e,t){return!i.cssMode||t!==p.length-1})).css(((te={})[ae]=w+"px",te))}if(i.centeredSlides&&i.centeredSlidesBounds){var ie=0;v.forEach((function(e){ie+=e+(i.spaceBetween?i.spaceBetween:0)}));var se=(ie-=i.spaceBetween)-r;c=c.map((function(e){return e<0?-f:e>se?se+m:e}))}if(i.centerInsufficientSlides){var re=0;if(v.forEach((function(e){re+=e+(i.spaceBetween?i.spaceBetween:0)})),(re-=i.spaceBetween)1)if(a.params.centeredSlides)a.visibleSlides.each((function(e){i.push(e)}));else for(t=0;ta.slides.length&&!s)break;i.push(n(l))}else i.push(n(a.activeIndex));for(t=0;tr?o:r}r&&a.$wrapperEl.css("height",r+"px")},updateSlidesOffset:function(){for(var e=this.slides,t=0;t=0&&d1&&p<=t.size||d<=0&&p>=t.size)&&(t.visibleSlides.push(l),t.visibleSlidesIndexes.push(n),i.eq(n).addClass(a.slideVisibleClass))}l.progress=s?-o:o}t.visibleSlides=m(t.visibleSlides)}},updateProgress:function(e){var t=this;if(void 0===e){var a=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*a||0}var i=t.params,s=t.maxTranslate()-t.minTranslate(),r=t.progress,n=t.isBeginning,l=t.isEnd,o=n,d=l;0===s?(r=0,n=!0,l=!0):(n=(r=(e-t.minTranslate())/s)<=0,l=r>=1),M(t,{progress:r,isBeginning:n,isEnd:l}),(i.watchSlidesProgress||i.watchSlidesVisibility||i.centeredSlides&&i.autoHeight)&&t.updateSlidesProgress(e),n&&!o&&t.emit("reachBeginning toEdge"),l&&!d&&t.emit("reachEnd toEdge"),(o&&!n||d&&!l)&&t.emit("fromEdge"),t.emit("progress",r)},updateSlidesClasses:function(){var e,t=this,a=t.slides,i=t.params,s=t.$wrapperEl,r=t.activeIndex,n=t.realIndex,l=t.virtual&&i.virtual.enabled;a.removeClass(i.slideActiveClass+" "+i.slideNextClass+" "+i.slidePrevClass+" "+i.slideDuplicateActiveClass+" "+i.slideDuplicateNextClass+" "+i.slideDuplicatePrevClass),(e=l?t.$wrapperEl.find("."+i.slideClass+'[data-swiper-slide-index="'+r+'"]'):a.eq(r)).addClass(i.slideActiveClass),i.loop&&(e.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass));var o=e.nextAll("."+i.slideClass).eq(0).addClass(i.slideNextClass);i.loop&&0===o.length&&(o=a.eq(0)).addClass(i.slideNextClass);var d=e.prevAll("."+i.slideClass).eq(0).addClass(i.slidePrevClass);i.loop&&0===d.length&&(d=a.eq(-1)).addClass(i.slidePrevClass),i.loop&&(o.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+o.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+o.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass),d.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass)),t.emitSlidesClasses()},updateActiveIndex:function(e){var t,a=this,i=a.rtlTranslate?a.translate:-a.translate,s=a.slidesGrid,r=a.snapGrid,n=a.params,l=a.activeIndex,o=a.realIndex,d=a.snapIndex,p=e;if(void 0===p){for(var u=0;u=s[u]&&i=s[u]&&i=s[u]&&(p=u);n.normalizeSlideIndex&&(p<0||void 0===p)&&(p=0)}if(r.indexOf(i)>=0)t=r.indexOf(i);else{var c=Math.min(n.slidesPerGroupSkip,p);t=c+Math.floor((p-c)/n.slidesPerGroup)}if(t>=r.length&&(t=r.length-1),p!==l){var h=parseInt(a.slides.eq(p).attr("data-swiper-slide-index")||p,10);M(a,{snapIndex:t,realIndex:h,previousIndex:l,activeIndex:p}),a.emit("activeIndexChange"),a.emit("snapIndexChange"),o!==h&&a.emit("realIndexChange"),(a.initialized||a.params.runCallbacksOnInit)&&a.emit("slideChange")}else t!==d&&(a.snapIndex=t,a.emit("snapIndexChange"))},updateClickedSlide:function(e){var t,a=this,i=a.params,s=m(e.target).closest("."+i.slideClass)[0],r=!1;if(s)for(var n=0;nd?d:i&&er?"next":is?"next":i=d.length&&(g=d.length-1),(c||o.initialSlide||0)===(u||0)&&a&&n.emit("beforeSlideChangeStart");var b,w=-d[g];if(n.updateProgress(w),o.normalizeSlideIndex)for(var y=0;y=x&&E=x&&E=x&&(l=y)}if(n.initialized&&l!==c){if(!n.allowSlideNext&&wn.translate&&w>n.maxTranslate()&&(c||0)!==l)return!1}if(b=l>c?"next":l=e&&(h=e)})),void 0!==h&&(p=l.indexOf(h))<0&&(p=i.activeIndex-1),i.slideTo(p,e,t,a)},slideReset:function(e,t,a){return void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),this.slideTo(this.activeIndex,e,t,a)},slideToClosest:function(e,t,a,i){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),void 0===i&&(i=.5);var s=this,r=s.activeIndex,n=Math.min(s.params.slidesPerGroupSkip,r),l=n+Math.floor((r-n)/s.params.slidesPerGroup),o=s.rtlTranslate?s.translate:-s.translate;if(o>=s.snapGrid[l]){var d=s.snapGrid[l];o-d>(s.snapGrid[l+1]-d)*i&&(r+=s.params.slidesPerGroup)}else{var p=s.snapGrid[l-1];o-p<=(s.snapGrid[l]-p)*i&&(r-=s.params.slidesPerGroup)}return r=Math.max(r,0),r=Math.min(r,s.slidesGrid.length-1),s.slideTo(r,e,t,a)},slideToClickedSlide:function(){var e,t=this,a=t.params,i=t.$wrapperEl,s="auto"===a.slidesPerView?t.slidesPerViewDynamic():a.slidesPerView,r=t.clickedIndex;if(a.loop){if(t.animating)return;e=parseInt(m(t.clickedSlide).attr("data-swiper-slide-index"),10),a.centeredSlides?rt.slides.length-t.loopedSlides+s/2?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),E((function(){t.slideTo(r)}))):t.slideTo(r):r>t.slides.length-s?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),E((function(){t.slideTo(r)}))):t.slideTo(r)}else t.slideTo(r)}},loop:{loopCreate:function(){var e=this,t=r(),a=e.params,i=e.$wrapperEl;i.children("."+a.slideClass+"."+a.slideDuplicateClass).remove();var s=i.children("."+a.slideClass);if(a.loopFillGroupWithBlank){var n=a.slidesPerGroup-s.length%a.slidesPerGroup;if(n!==a.slidesPerGroup){for(var l=0;ls.length&&(e.loopedSlides=s.length);var d=[],p=[];s.each((function(t,a){var i=m(t);a=s.length-e.loopedSlides&&d.push(t),i.attr("data-swiper-slide-index",a)}));for(var u=0;u=0;c-=1)i.prepend(m(d[c].cloneNode(!0)).addClass(a.slideDuplicateClass))},loopFix:function(){var e=this;e.emit("beforeLoopFix");var t,a=e.activeIndex,i=e.slides,s=e.loopedSlides,r=e.allowSlidePrev,n=e.allowSlideNext,l=e.snapGrid,o=e.rtlTranslate;e.allowSlidePrev=!0,e.allowSlideNext=!0;var d=-l[a]-e.getTranslate();if(a=i.length-s){t=-i.length+a+s,t+=s,e.slideTo(t,0,!1,!0)&&0!==d&&e.setTranslate((o?-e.translate:e.translate)-d)}e.allowSlidePrev=r,e.allowSlideNext=n,e.emit("loopFix")},loopDestroy:function(){var e=this,t=e.$wrapperEl,a=e.params,i=e.slides;t.children("."+a.slideClass+"."+a.slideDuplicateClass+",."+a.slideClass+"."+a.slideBlankClass).remove(),i.removeAttr("data-swiper-slide-index")}},grabCursor:{setGrabCursor:function(e){var t=this;if(!(t.support.touch||!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)){var a=t.el;a.style.cursor="move",a.style.cursor=e?"-webkit-grabbing":"-webkit-grab",a.style.cursor=e?"-moz-grabbin":"-moz-grab",a.style.cursor=e?"grabbing":"grab"}},unsetGrabCursor:function(){var e=this;e.support.touch||e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e.el.style.cursor="")}},manipulation:{appendSlide:function(e){var t=this,a=t.$wrapperEl,i=t.params;if(i.loop&&t.loopDestroy(),"object"==typeof e&&"length"in e)for(var s=0;s=n)a.appendSlide(t);else{for(var l=r>e?r+1:r,o=[],d=n-1;d>=e;d-=1){var p=a.slides.eq(d);p.remove(),o.unshift(p)}if("object"==typeof t&&"length"in t){for(var u=0;ue?r+t.length:r}else i.append(t);for(var c=0;c1,c=p.slidesPerColumn>1,h=r.enabled;u&&!c?(n.removeClass(r.containerModifierClass+"multirow "+r.containerModifierClass+"multirow-column"),e.emitContainerClasses()):!u&&c&&(n.addClass(r.containerModifierClass+"multirow"),(p.slidesPerColumnFill&&"column"===p.slidesPerColumnFill||!p.slidesPerColumnFill&&"column"===r.slidesPerColumnFill)&&n.addClass(r.containerModifierClass+"multirow-column"),e.emitContainerClasses());var v=p.direction&&p.direction!==r.direction,f=r.loop&&(p.slidesPerView!==r.slidesPerView||v);v&&a&&e.changeDirection(),M(e.params,p);var m=e.params.enabled;M(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),h&&!m?e.disable():!h&&m&&e.enable(),e.currentBreakpoint=o,e.emit("_beforeBreakpoint",p),f&&a&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-s+e.loopedSlides,0,!1)),e.emit("breakpoint",p)}}},getBreakpoint:function(e,t,a){if(void 0===t&&(t="window"),e&&("container"!==t||a)){var i=!1,s=l(),r="window"===t?s.innerHeight:a.clientHeight,n=Object.keys(e).map((function(e){if("string"==typeof e&&0===e.indexOf("@")){var t=parseFloat(e.substr(1));return{value:r*t,point:e}}return{value:e,point:e}}));n.sort((function(e,t){return parseInt(e.value,10)-parseInt(t.value,10)}));for(var o=0;o0&&t.slidesOffsetBefore+t.spaceBetween*(e.slides.length-1)+e.slides[0].offsetWidth*e.slides.length;t.slidesOffsetBefore&&t.slidesOffsetAfter&&i?e.isLocked=i<=e.size:e.isLocked=1===e.snapGrid.length,e.allowSlideNext=!e.isLocked,e.allowSlidePrev=!e.isLocked,a!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock"),a&&a!==e.isLocked&&(e.isEnd=!1,e.navigation&&e.navigation.update())}},classes:{addClasses:function(){var e,t,a,i=this,s=i.classNames,r=i.params,n=i.rtl,l=i.$el,o=i.device,d=i.support,p=(e=["initialized",r.direction,{"pointer-events":d.pointerEvents&&!d.touch},{"free-mode":r.freeMode},{autoheight:r.autoHeight},{rtl:n},{multirow:r.slidesPerColumn>1},{"multirow-column":r.slidesPerColumn>1&&"column"===r.slidesPerColumnFill},{android:o.android},{ios:o.ios},{"css-mode":r.cssMode}],t=r.containerModifierClass,a=[],e.forEach((function(e){"object"==typeof e?Object.keys(e).forEach((function(i){e[i]&&a.push(t+i)})):"string"==typeof e&&a.push(t+e)})),a);s.push.apply(s,p),l.addClass([].concat(s).join(" ")),i.emitContainerClasses()},removeClasses:function(){var e=this,t=e.$el,a=e.classNames;t.removeClass(a.join(" ")),e.emitContainerClasses()}},images:{loadImage:function(e,t,a,i,s,r){var n,o=l();function d(){r&&r()}m(e).parent("picture")[0]||e.complete&&s?d():t?((n=new o.Image).onload=d,n.onerror=d,i&&(n.sizes=i),a&&(n.srcset=a),t&&(n.src=t)):d()},preloadImages:function(){var e=this;function t(){null!=e&&e&&!e.destroyed&&(void 0!==e.imagesLoaded&&(e.imagesLoaded+=1),e.imagesLoaded===e.imagesToLoad.length&&(e.params.updateOnImagesReady&&e.update(),e.emit("imagesReady")))}e.imagesToLoad=e.$el.find("img");for(var a=0;a1){var n=[];return m(a.el).each((function(e){var i=M({},a,{el:e});n.push(new t(i))})),n}var l=this;l.__swiper__=!0,l.support=$(),l.device=L({userAgent:a.userAgent}),l.browser=I(),l.eventsListeners={},l.eventsAnyListeners=[],void 0===l.modules&&(l.modules={}),Object.keys(l.modules).forEach((function(e){var t=l.modules[e];if(t.params){var i=Object.keys(t.params)[0],s=t.params[i];if("object"!=typeof s||null===s)return;if(["navigation","pagination","scrollbar"].indexOf(i)>=0&&!0===a[i]&&(a[i]={auto:!0}),!(i in a)||!("enabled"in s))return;!0===a[i]&&(a[i]={enabled:!0}),"object"!=typeof a[i]||"enabled"in a[i]||(a[i].enabled=!0),a[i]||(a[i]={enabled:!1})}}));var o,d,p=M({},W);return l.useParams(p),l.params=M({},p,_,a),l.originalParams=M({},l.params),l.passedParams=M({},a),l.params&&l.params.on&&Object.keys(l.params.on).forEach((function(e){l.on(e,l.params.on[e])})),l.params&&l.params.onAny&&l.onAny(l.params.onAny),l.$=m,M(l,{enabled:l.params.enabled,el:e,classNames:[],slides:m(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:function(){return"horizontal"===l.params.direction},isVertical:function(){return"vertical"===l.params.direction},activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:l.params.allowSlideNext,allowSlidePrev:l.params.allowSlidePrev,touchEvents:(o=["touchstart","touchmove","touchend","touchcancel"],d=["mousedown","mousemove","mouseup"],l.support.pointerEvents&&(d=["pointerdown","pointermove","pointerup"]),l.touchEventsTouch={start:o[0],move:o[1],end:o[2],cancel:o[3]},l.touchEventsDesktop={start:d[0],move:d[1],end:d[2]},l.support.touch||!l.params.simulateTouch?l.touchEventsTouch:l.touchEventsDesktop),touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:l.params.focusableElements,lastClickTime:x(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:l.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),l.useModules(),l.emit("_swiper"),l.params.init&&l.init(),l}var a,i,s,n=t.prototype;return n.enable=function(){var e=this;e.enabled||(e.enabled=!0,e.params.grabCursor&&e.setGrabCursor(),e.emit("enable"))},n.disable=function(){var e=this;e.enabled&&(e.enabled=!1,e.params.grabCursor&&e.unsetGrabCursor(),e.emit("disable"))},n.setProgress=function(e,t){var a=this;e=Math.min(Math.max(e,0),1);var i=a.minTranslate(),s=(a.maxTranslate()-i)*e+i;a.translateTo(s,void 0===t?0:t),a.updateActiveIndex(),a.updateSlidesClasses()},n.emitContainerClasses=function(){var e=this;if(e.params._emitClasses&&e.el){var t=e.el.className.split(" ").filter((function(t){return 0===t.indexOf("swiper-container")||0===t.indexOf(e.params.containerModifierClass)}));e.emit("_containerClasses",t.join(" "))}},n.getSlideClasses=function(e){var t=this;return e.className.split(" ").filter((function(e){return 0===e.indexOf("swiper-slide")||0===e.indexOf(t.params.slideClass)})).join(" ")},n.emitSlidesClasses=function(){var e=this;if(e.params._emitClasses&&e.el){var t=[];e.slides.each((function(a){var i=e.getSlideClasses(a);t.push({slideEl:a,classNames:i}),e.emit("_slideClass",a,i)})),e.emit("_slideClasses",t)}},n.slidesPerViewDynamic=function(){var e=this,t=e.params,a=e.slides,i=e.slidesGrid,s=e.size,r=e.activeIndex,n=1;if(t.centeredSlides){for(var l,o=a[r].swiperSlideSize,d=r+1;ds&&(l=!0));for(var p=r-1;p>=0;p-=1)a[p]&&!l&&(n+=1,(o+=a[p].swiperSlideSize)>s&&(l=!0))}else for(var u=r+1;u1)&&e.isEnd&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0))||i(),a.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}function i(){var t=e.rtlTranslate?-1*e.translate:e.translate,a=Math.min(Math.max(t,e.maxTranslate()),e.minTranslate());e.setTranslate(a),e.updateActiveIndex(),e.updateSlidesClasses()}},n.changeDirection=function(e,t){void 0===t&&(t=!0);var a=this,i=a.params.direction;return e||(e="horizontal"===i?"vertical":"horizontal"),e===i||"horizontal"!==e&&"vertical"!==e||(a.$el.removeClass(""+a.params.containerModifierClass+i).addClass(""+a.params.containerModifierClass+e),a.emitContainerClasses(),a.params.direction=e,a.slides.each((function(t){"vertical"===e?t.style.width="":t.style.height=""})),a.emit("changeDirection"),t&&a.update()),a},n.mount=function(e){var t=this;if(t.mounted)return!0;var a=m(e||t.params.el);if(!(e=a[0]))return!1;e.swiper=t;var i=function(){return"."+(t.params.wrapperClass||"").trim().split(" ").join(".")},s=function(){if(e&&e.shadowRoot&&e.shadowRoot.querySelector){var t=m(e.shadowRoot.querySelector(i()));return t.children=function(e){return a.children(e)},t}return a.children(i())}();if(0===s.length&&t.params.createElements){var n=r().createElement("div");s=m(n),n.className=t.params.wrapperClass,a.append(n),a.children("."+t.params.slideClass).each((function(e){s.append(e)}))}return M(t,{$el:a,el:e,$wrapperEl:s,wrapperEl:s[0],mounted:!0,rtl:"rtl"===e.dir.toLowerCase()||"rtl"===a.css("direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===e.dir.toLowerCase()||"rtl"===a.css("direction")),wrongRTL:"-webkit-box"===s.css("display")}),!0},n.init=function(e){var t=this;return t.initialized||!1===t.mount(e)||(t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.params.loop&&t.loopCreate(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.preloadImages&&t.preloadImages(),t.params.loop?t.slideTo(t.params.initialSlide+t.loopedSlides,0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.attachEvents(),t.initialized=!0,t.emit("init"),t.emit("afterInit")),t},n.destroy=function(e,t){void 0===e&&(e=!0),void 0===t&&(t=!0);var a,i=this,s=i.params,r=i.$el,n=i.$wrapperEl,l=i.slides;return void 0===i.params||i.destroyed||(i.emit("beforeDestroy"),i.initialized=!1,i.detachEvents(),s.loop&&i.loopDestroy(),t&&(i.removeClasses(),r.removeAttr("style"),n.removeAttr("style"),l&&l.length&&l.removeClass([s.slideVisibleClass,s.slideActiveClass,s.slideNextClass,s.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index")),i.emit("destroy"),Object.keys(i.eventsListeners).forEach((function(e){i.off(e)})),!1!==e&&(i.$el[0].swiper=null,a=i,Object.keys(a).forEach((function(e){try{a[e]=null}catch(e){}try{delete a[e]}catch(e){}}))),i.destroyed=!0),null},t.extendDefaults=function(e){M(_,e)},t.installModule=function(e){t.prototype.modules||(t.prototype.modules={});var a=e.name||Object.keys(t.prototype.modules).length+"_"+x();t.prototype.modules[a]=e},t.use=function(e){return Array.isArray(e)?(e.forEach((function(e){return t.installModule(e)})),t):(t.installModule(e),t)},a=t,s=[{key:"extendedDefaults",get:function(){return _}},{key:"defaults",get:function(){return W}}],(i=null)&&e(a.prototype,i),s&&e(a,s),t}();Object.keys(F).forEach((function(e){Object.keys(F[e]).forEach((function(t){q.prototype[t]=F[e][t]}))})),q.use([O,D]);var j={update:function(e){var t=this,a=t.params,i=a.slidesPerView,s=a.slidesPerGroup,r=a.centeredSlides,n=t.params.virtual,l=n.addSlidesBefore,o=n.addSlidesAfter,d=t.virtual,p=d.from,u=d.to,c=d.slides,h=d.slidesGrid,v=d.renderSlide,f=d.offset;t.updateActiveIndex();var m,g,b,w=t.activeIndex||0;m=t.rtlTranslate?"right":t.isHorizontal()?"left":"top",r?(g=Math.floor(i/2)+s+o,b=Math.floor(i/2)+s+l):(g=i+(s-1)+o,b=s+l);var y=Math.max((w||0)-b,0),E=Math.min((w||0)+g,c.length-1),x=(t.slidesGrid[y]||0)-(t.slidesGrid[0]||0);function T(){t.updateSlides(),t.updateProgress(),t.updateSlidesClasses(),t.lazy&&t.params.lazy.enabled&&t.lazy.load()}if(M(t.virtual,{from:y,to:E,offset:x,slidesGrid:t.slidesGrid}),p===y&&u===E&&!e)return t.slidesGrid!==h&&x!==f&&t.slides.css(m,x+"px"),void t.updateProgress();if(t.params.virtual.renderExternal)return t.params.virtual.renderExternal.call(t,{offset:x,from:y,to:E,slides:function(){for(var e=[],t=y;t<=E;t+=1)e.push(c[t]);return e}()}),void(t.params.virtual.renderExternalUpdate&&T());var C=[],S=[];if(e)t.$wrapperEl.find("."+t.params.slideClass).remove();else for(var z=p;z<=u;z+=1)(zE)&&t.$wrapperEl.find("."+t.params.slideClass+'[data-swiper-slide-index="'+z+'"]').remove();for(var P=0;P=y&&P<=E&&(void 0===u||e?S.push(P):(P>u&&S.push(P),P'+e+"");return s.attr("data-swiper-slide-index")||s.attr("data-swiper-slide-index",t),i.cache&&(a.virtual.cache[t]=s),s},appendSlide:function(e){var t=this;if("object"==typeof e&&"length"in e)for(var a=0;a=0;i-=1)t.virtual.slides.splice(e[i],1),t.params.virtual.cache&&delete t.virtual.cache[e[i]],e[i]0&&0===t.$el.parents("."+t.params.slideActiveClass).length)return;var g=t.$el,b=g[0].clientWidth,w=g[0].clientHeight,y=a.innerWidth,E=a.innerHeight,x=t.$el.offset();s&&(x.left-=t.$el[0].scrollLeft);for(var T=[[x.left,x.top],[x.left+b,x.top],[x.left,x.top+w],[x.left+b,x.top+w]],C=0;C=0&&S[0]<=y&&S[1]>=0&&S[1]<=E){if(0===S[0]&&0===S[1])continue;m=!0}}if(!m)return}t.isHorizontal()?((p||u||c||h)&&(n.preventDefault?n.preventDefault():n.returnValue=!1),((u||h)&&!s||(p||c)&&s)&&t.slideNext(),((p||c)&&!s||(u||h)&&s)&&t.slidePrev()):((p||u||v||f)&&(n.preventDefault?n.preventDefault():n.returnValue=!1),(u||f)&&t.slideNext(),(p||v)&&t.slidePrev()),t.emit("keyPress",o)}}},enable:function(){var e=this,t=r();e.keyboard.enabled||(m(t).on("keydown",e.keyboard.handle),e.keyboard.enabled=!0)},disable:function(){var e=this,t=r();e.keyboard.enabled&&(m(t).off("keydown",e.keyboard.handle),e.keyboard.enabled=!1)}},Z={name:"keyboard",params:{keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0}},create:function(){z(this,{keyboard:t({enabled:!1},K)})},on:{init:function(e){e.params.keyboard.enabled&&e.keyboard.enable()},destroy:function(e){e.keyboard.enabled&&e.keyboard.disable()}}};var J={lastScrollTime:x(),lastEventBeforeSnap:void 0,recentWheelEvents:[],event:function(){return l().navigator.userAgent.indexOf("firefox")>-1?"DOMMouseScroll":function(){var e=r(),t="onwheel",a=t in e;if(!a){var i=e.createElement("div");i.setAttribute(t,"return;"),a="function"==typeof i.onwheel}return!a&&e.implementation&&e.implementation.hasFeature&&!0!==e.implementation.hasFeature("","")&&(a=e.implementation.hasFeature("Events.wheel","3.0")),a}()?"wheel":"mousewheel"},normalize:function(e){var t=0,a=0,i=0,s=0;return"detail"in e&&(a=e.detail),"wheelDelta"in e&&(a=-e.wheelDelta/120),"wheelDeltaY"in e&&(a=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=a,a=0),i=10*t,s=10*a,"deltaY"in e&&(s=e.deltaY),"deltaX"in e&&(i=e.deltaX),e.shiftKey&&!i&&(i=s,s=0),(i||s)&&e.deltaMode&&(1===e.deltaMode?(i*=40,s*=40):(i*=800,s*=800)),i&&!t&&(t=i<1?-1:1),s&&!a&&(a=s<1?-1:1),{spinX:t,spinY:a,pixelX:i,pixelY:s}},handleMouseEnter:function(){this.enabled&&(this.mouseEntered=!0)},handleMouseLeave:function(){this.enabled&&(this.mouseEntered=!1)},handle:function(e){var t=e,a=this;if(a.enabled){var i=a.params.mousewheel;a.params.cssMode&&t.preventDefault();var s=a.$el;if("container"!==a.params.mousewheel.eventsTarget&&(s=m(a.params.mousewheel.eventsTarget)),!a.mouseEntered&&!s[0].contains(t.target)&&!i.releaseOnEdges)return!0;t.originalEvent&&(t=t.originalEvent);var r=0,n=a.rtlTranslate?-1:1,l=J.normalize(t);if(i.forceToAxis)if(a.isHorizontal()){if(!(Math.abs(l.pixelX)>Math.abs(l.pixelY)))return!0;r=-l.pixelX*n}else{if(!(Math.abs(l.pixelY)>Math.abs(l.pixelX)))return!0;r=-l.pixelY}else r=Math.abs(l.pixelX)>Math.abs(l.pixelY)?-l.pixelX*n:-l.pixelY;if(0===r)return!0;i.invert&&(r=-r);var o=a.getTranslate()+r*i.sensitivity;if(o>=a.minTranslate()&&(o=a.minTranslate()),o<=a.maxTranslate()&&(o=a.maxTranslate()),(!!a.params.loop||!(o===a.minTranslate()||o===a.maxTranslate()))&&a.params.nested&&t.stopPropagation(),a.params.freeMode){var d={time:x(),delta:Math.abs(r),direction:Math.sign(r)},p=a.mousewheel.lastEventBeforeSnap,u=p&&d.time=a.minTranslate()&&(c=a.minTranslate()),c<=a.maxTranslate()&&(c=a.maxTranslate()),a.setTransition(0),a.setTranslate(c),a.updateProgress(),a.updateActiveIndex(),a.updateSlidesClasses(),(!h&&a.isBeginning||!v&&a.isEnd)&&a.updateSlidesClasses(),a.params.freeModeSticky){clearTimeout(a.mousewheel.timeout),a.mousewheel.timeout=void 0;var f=a.mousewheel.recentWheelEvents;f.length>=15&&f.shift();var g=f.length?f[f.length-1]:void 0,b=f[0];if(f.push(d),g&&(d.delta>g.delta||d.direction!==g.direction))f.splice(0);else if(f.length>=15&&d.time-b.time<500&&b.delta-d.delta>=1&&d.delta<=6){var w=r>0?.8:.2;a.mousewheel.lastEventBeforeSnap=d,f.splice(0),a.mousewheel.timeout=E((function(){a.slideToClosest(a.params.speed,!0,void 0,w)}),0)}a.mousewheel.timeout||(a.mousewheel.timeout=E((function(){a.mousewheel.lastEventBeforeSnap=d,f.splice(0),a.slideToClosest(a.params.speed,!0,void 0,.5)}),500))}if(u||a.emit("scroll",t),a.params.autoplay&&a.params.autoplayDisableOnInteraction&&a.autoplay.stop(),c===a.minTranslate()||c===a.maxTranslate())return!0}}else{var y={time:x(),delta:Math.abs(r),direction:Math.sign(r),raw:e},T=a.mousewheel.recentWheelEvents;T.length>=2&&T.shift();var C=T.length?T[T.length-1]:void 0;if(T.push(y),C?(y.direction!==C.direction||y.delta>C.delta||y.time>C.time+150)&&a.mousewheel.animateSlider(y):a.mousewheel.animateSlider(y),a.mousewheel.releaseScroll(y))return!0}return t.preventDefault?t.preventDefault():t.returnValue=!1,!1}},animateSlider:function(e){var t=this,a=l();return!(this.params.mousewheel.thresholdDelta&&e.delta=6&&x()-t.mousewheel.lastScrollTime<60||(e.direction<0?t.isEnd&&!t.params.loop||t.animating||(t.slideNext(),t.emit("scroll",e.raw)):t.isBeginning&&!t.params.loop||t.animating||(t.slidePrev(),t.emit("scroll",e.raw)),t.mousewheel.lastScrollTime=(new a.Date).getTime(),!1)))},releaseScroll:function(e){var t=this,a=t.params.mousewheel;if(e.direction<0){if(t.isEnd&&!t.params.loop&&a.releaseOnEdges)return!0}else if(t.isBeginning&&!t.params.loop&&a.releaseOnEdges)return!0;return!1},enable:function(){var e=this,t=J.event();if(e.params.cssMode)return e.wrapperEl.removeEventListener(t,e.mousewheel.handle),!0;if(!t)return!1;if(e.mousewheel.enabled)return!1;var a=e.$el;return"container"!==e.params.mousewheel.eventsTarget&&(a=m(e.params.mousewheel.eventsTarget)),a.on("mouseenter",e.mousewheel.handleMouseEnter),a.on("mouseleave",e.mousewheel.handleMouseLeave),a.on(t,e.mousewheel.handle),e.mousewheel.enabled=!0,!0},disable:function(){var e=this,t=J.event();if(e.params.cssMode)return e.wrapperEl.addEventListener(t,e.mousewheel.handle),!0;if(!t)return!1;if(!e.mousewheel.enabled)return!1;var a=e.$el;return"container"!==e.params.mousewheel.eventsTarget&&(a=m(e.params.mousewheel.eventsTarget)),a.off(t,e.mousewheel.handle),e.mousewheel.enabled=!1,!0}},Q={toggleEl:function(e,t){e[t?"addClass":"removeClass"](this.params.navigation.disabledClass),e[0]&&"BUTTON"===e[0].tagName&&(e[0].disabled=t)},update:function(){var e=this,t=e.params.navigation,a=e.navigation.toggleEl;if(!e.params.loop){var i=e.navigation,s=i.$nextEl,r=i.$prevEl;r&&r.length>0&&(e.isBeginning?a(r,!0):a(r,!1),e.params.watchOverflow&&e.enabled&&r[e.isLocked?"addClass":"removeClass"](t.lockClass)),s&&s.length>0&&(e.isEnd?a(s,!0):a(s,!1),e.params.watchOverflow&&e.enabled&&s[e.isLocked?"addClass":"removeClass"](t.lockClass))}},onPrevClick:function(e){var t=this;e.preventDefault(),t.isBeginning&&!t.params.loop||t.slidePrev()},onNextClick:function(e){var t=this;e.preventDefault(),t.isEnd&&!t.params.loop||t.slideNext()},init:function(){var e,t,a=this,i=a.params.navigation;(a.params.navigation=k(a.$el,a.params.navigation,a.params.createElements,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"}),i.nextEl||i.prevEl)&&(i.nextEl&&(e=m(i.nextEl),a.params.uniqueNavElements&&"string"==typeof i.nextEl&&e.length>1&&1===a.$el.find(i.nextEl).length&&(e=a.$el.find(i.nextEl))),i.prevEl&&(t=m(i.prevEl),a.params.uniqueNavElements&&"string"==typeof i.prevEl&&t.length>1&&1===a.$el.find(i.prevEl).length&&(t=a.$el.find(i.prevEl))),e&&e.length>0&&e.on("click",a.navigation.onNextClick),t&&t.length>0&&t.on("click",a.navigation.onPrevClick),M(a.navigation,{$nextEl:e,nextEl:e&&e[0],$prevEl:t,prevEl:t&&t[0]}),a.enabled||(e&&e.addClass(i.lockClass),t&&t.addClass(i.lockClass)))},destroy:function(){var e=this,t=e.navigation,a=t.$nextEl,i=t.$prevEl;a&&a.length&&(a.off("click",e.navigation.onNextClick),a.removeClass(e.params.navigation.disabledClass)),i&&i.length&&(i.off("click",e.navigation.onPrevClick),i.removeClass(e.params.navigation.disabledClass))}},ee={update:function(){var e=this,t=e.rtl,a=e.params.pagination;if(a.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var i,s=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,r=e.pagination.$el,n=e.params.loop?Math.ceil((s-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;if(e.params.loop?((i=Math.ceil((e.activeIndex-e.loopedSlides)/e.params.slidesPerGroup))>s-1-2*e.loopedSlides&&(i-=s-2*e.loopedSlides),i>n-1&&(i-=n),i<0&&"bullets"!==e.params.paginationType&&(i=n+i)):i=void 0!==e.snapIndex?e.snapIndex:e.activeIndex||0,"bullets"===a.type&&e.pagination.bullets&&e.pagination.bullets.length>0){var l,o,d,p=e.pagination.bullets;if(a.dynamicBullets&&(e.pagination.bulletSize=p.eq(0)[e.isHorizontal()?"outerWidth":"outerHeight"](!0),r.css(e.isHorizontal()?"width":"height",e.pagination.bulletSize*(a.dynamicMainBullets+4)+"px"),a.dynamicMainBullets>1&&void 0!==e.previousIndex&&(e.pagination.dynamicBulletIndex+=i-e.previousIndex,e.pagination.dynamicBulletIndex>a.dynamicMainBullets-1?e.pagination.dynamicBulletIndex=a.dynamicMainBullets-1:e.pagination.dynamicBulletIndex<0&&(e.pagination.dynamicBulletIndex=0)),l=i-e.pagination.dynamicBulletIndex,d=((o=l+(Math.min(p.length,a.dynamicMainBullets)-1))+l)/2),p.removeClass(a.bulletActiveClass+" "+a.bulletActiveClass+"-next "+a.bulletActiveClass+"-next-next "+a.bulletActiveClass+"-prev "+a.bulletActiveClass+"-prev-prev "+a.bulletActiveClass+"-main"),r.length>1)p.each((function(e){var t=m(e),s=t.index();s===i&&t.addClass(a.bulletActiveClass),a.dynamicBullets&&(s>=l&&s<=o&&t.addClass(a.bulletActiveClass+"-main"),s===l&&t.prev().addClass(a.bulletActiveClass+"-prev").prev().addClass(a.bulletActiveClass+"-prev-prev"),s===o&&t.next().addClass(a.bulletActiveClass+"-next").next().addClass(a.bulletActiveClass+"-next-next"))}));else{var u=p.eq(i),c=u.index();if(u.addClass(a.bulletActiveClass),a.dynamicBullets){for(var h=p.eq(l),v=p.eq(o),f=l;f<=o;f+=1)p.eq(f).addClass(a.bulletActiveClass+"-main");if(e.params.loop)if(c>=p.length-a.dynamicMainBullets){for(var g=a.dynamicMainBullets;g>=0;g-=1)p.eq(p.length-g).addClass(a.bulletActiveClass+"-main");p.eq(p.length-a.dynamicMainBullets-1).addClass(a.bulletActiveClass+"-prev")}else h.prev().addClass(a.bulletActiveClass+"-prev").prev().addClass(a.bulletActiveClass+"-prev-prev"),v.next().addClass(a.bulletActiveClass+"-next").next().addClass(a.bulletActiveClass+"-next-next");else h.prev().addClass(a.bulletActiveClass+"-prev").prev().addClass(a.bulletActiveClass+"-prev-prev"),v.next().addClass(a.bulletActiveClass+"-next").next().addClass(a.bulletActiveClass+"-next-next")}}if(a.dynamicBullets){var b=Math.min(p.length,a.dynamicMainBullets+4),w=(e.pagination.bulletSize*b-e.pagination.bulletSize)/2-d*e.pagination.bulletSize,y=t?"right":"left";p.css(e.isHorizontal()?y:"top",w+"px")}}if("fraction"===a.type&&(r.find(P(a.currentClass)).text(a.formatFractionCurrent(i+1)),r.find(P(a.totalClass)).text(a.formatFractionTotal(n))),"progressbar"===a.type){var E;E=a.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";var x=(i+1)/n,T=1,C=1;"horizontal"===E?T=x:C=x,r.find(P(a.progressbarFillClass)).transform("translate3d(0,0,0) scaleX("+T+") scaleY("+C+")").transition(e.params.speed)}"custom"===a.type&&a.renderCustom?(r.html(a.renderCustom(e,i+1,n)),e.emit("paginationRender",r[0])):e.emit("paginationUpdate",r[0]),e.params.watchOverflow&&e.enabled&&r[e.isLocked?"addClass":"removeClass"](a.lockClass)}},render:function(){var e=this,t=e.params.pagination;if(t.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var a=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,i=e.pagination.$el,s="";if("bullets"===t.type){var r=e.params.loop?Math.ceil((a-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;e.params.freeMode&&!e.params.loop&&r>a&&(r=a);for(var n=0;n";i.html(s),e.pagination.bullets=i.find(P(t.bulletClass))}"fraction"===t.type&&(s=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):' / ',i.html(s)),"progressbar"===t.type&&(s=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):'',i.html(s)),"custom"!==t.type&&e.emit("paginationRender",e.pagination.$el[0])}},init:function(){var e=this;e.params.pagination=k(e.$el,e.params.pagination,e.params.createElements,{el:"swiper-pagination"});var t=e.params.pagination;if(t.el){var a=m(t.el);0!==a.length&&(e.params.uniqueNavElements&&"string"==typeof t.el&&a.length>1&&(a=e.$el.find(t.el)),"bullets"===t.type&&t.clickable&&a.addClass(t.clickableClass),a.addClass(t.modifierClass+t.type),"bullets"===t.type&&t.dynamicBullets&&(a.addClass(""+t.modifierClass+t.type+"-dynamic"),e.pagination.dynamicBulletIndex=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&a.addClass(t.progressbarOppositeClass),t.clickable&&a.on("click",P(t.bulletClass),(function(t){t.preventDefault();var a=m(this).index()*e.params.slidesPerGroup;e.params.loop&&(a+=e.loopedSlides),e.slideTo(a)})),M(e.pagination,{$el:a,el:a[0]}),e.enabled||a.addClass(t.lockClass))}},destroy:function(){var e=this,t=e.params.pagination;if(t.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var a=e.pagination.$el;a.removeClass(t.hiddenClass),a.removeClass(t.modifierClass+t.type),e.pagination.bullets&&e.pagination.bullets.removeClass(t.bulletActiveClass),t.clickable&&a.off("click",P(t.bulletClass))}}},te={setTranslate:function(){var e=this;if(e.params.scrollbar.el&&e.scrollbar.el){var t=e.scrollbar,a=e.rtlTranslate,i=e.progress,s=t.dragSize,r=t.trackSize,n=t.$dragEl,l=t.$el,o=e.params.scrollbar,d=s,p=(r-s)*i;a?(p=-p)>0?(d=s-p,p=0):-p+s>r&&(d=r+p):p<0?(d=s+p,p=0):p+s>r&&(d=r-p),e.isHorizontal()?(n.transform("translate3d("+p+"px, 0, 0)"),n[0].style.width=d+"px"):(n.transform("translate3d(0px, "+p+"px, 0)"),n[0].style.height=d+"px"),o.hide&&(clearTimeout(e.scrollbar.timeout),l[0].style.opacity=1,e.scrollbar.timeout=setTimeout((function(){l[0].style.opacity=0,l.transition(400)}),1e3))}},setTransition:function(e){var t=this;t.params.scrollbar.el&&t.scrollbar.el&&t.scrollbar.$dragEl.transition(e)},updateSize:function(){var e=this;if(e.params.scrollbar.el&&e.scrollbar.el){var t=e.scrollbar,a=t.$dragEl,i=t.$el;a[0].style.width="",a[0].style.height="";var s,r=e.isHorizontal()?i[0].offsetWidth:i[0].offsetHeight,n=e.size/e.virtualSize,l=n*(r/e.size);s="auto"===e.params.scrollbar.dragSize?r*n:parseInt(e.params.scrollbar.dragSize,10),e.isHorizontal()?a[0].style.width=s+"px":a[0].style.height=s+"px",i[0].style.display=n>=1?"none":"",e.params.scrollbar.hide&&(i[0].style.opacity=0),M(t,{trackSize:r,divider:n,moveDivider:l,dragSize:s}),e.params.watchOverflow&&e.enabled&&t.$el[e.isLocked?"addClass":"removeClass"](e.params.scrollbar.lockClass)}},getPointerPosition:function(e){return this.isHorizontal()?"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientX:e.clientX:"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].clientY:e.clientY},setDragPosition:function(e){var t,a=this,i=a.scrollbar,s=a.rtlTranslate,r=i.$el,n=i.dragSize,l=i.trackSize,o=i.dragStartPos;t=(i.getPointerPosition(e)-r.offset()[a.isHorizontal()?"left":"top"]-(null!==o?o:n/2))/(l-n),t=Math.max(Math.min(t,1),0),s&&(t=1-t);var d=a.minTranslate()+(a.maxTranslate()-a.minTranslate())*t;a.updateProgress(d),a.setTranslate(d),a.updateActiveIndex(),a.updateSlidesClasses()},onDragStart:function(e){var t=this,a=t.params.scrollbar,i=t.scrollbar,s=t.$wrapperEl,r=i.$el,n=i.$dragEl;t.scrollbar.isTouched=!0,t.scrollbar.dragStartPos=e.target===n[0]||e.target===n?i.getPointerPosition(e)-e.target.getBoundingClientRect()[t.isHorizontal()?"left":"top"]:null,e.preventDefault(),e.stopPropagation(),s.transition(100),n.transition(100),i.setDragPosition(e),clearTimeout(t.scrollbar.dragTimeout),r.transition(0),a.hide&&r.css("opacity",1),t.params.cssMode&&t.$wrapperEl.css("scroll-snap-type","none"),t.emit("scrollbarDragStart",e)},onDragMove:function(e){var t=this,a=t.scrollbar,i=t.$wrapperEl,s=a.$el,r=a.$dragEl;t.scrollbar.isTouched&&(e.preventDefault?e.preventDefault():e.returnValue=!1,a.setDragPosition(e),i.transition(0),s.transition(0),r.transition(0),t.emit("scrollbarDragMove",e))},onDragEnd:function(e){var t=this,a=t.params.scrollbar,i=t.scrollbar,s=t.$wrapperEl,r=i.$el;t.scrollbar.isTouched&&(t.scrollbar.isTouched=!1,t.params.cssMode&&(t.$wrapperEl.css("scroll-snap-type",""),s.transition("")),a.hide&&(clearTimeout(t.scrollbar.dragTimeout),t.scrollbar.dragTimeout=E((function(){r.css("opacity",0),r.transition(400)}),1e3)),t.emit("scrollbarDragEnd",e),a.snapOnRelease&&t.slideToClosest())},enableDraggable:function(){var e=this;if(e.params.scrollbar.el){var t=r(),a=e.scrollbar,i=e.touchEventsTouch,s=e.touchEventsDesktop,n=e.params,l=e.support,o=a.$el[0],d=!(!l.passiveListener||!n.passiveListeners)&&{passive:!1,capture:!1},p=!(!l.passiveListener||!n.passiveListeners)&&{passive:!0,capture:!1};o&&(l.touch?(o.addEventListener(i.start,e.scrollbar.onDragStart,d),o.addEventListener(i.move,e.scrollbar.onDragMove,d),o.addEventListener(i.end,e.scrollbar.onDragEnd,p)):(o.addEventListener(s.start,e.scrollbar.onDragStart,d),t.addEventListener(s.move,e.scrollbar.onDragMove,d),t.addEventListener(s.end,e.scrollbar.onDragEnd,p)))}},disableDraggable:function(){var e=this;if(e.params.scrollbar.el){var t=r(),a=e.scrollbar,i=e.touchEventsTouch,s=e.touchEventsDesktop,n=e.params,l=e.support,o=a.$el[0],d=!(!l.passiveListener||!n.passiveListeners)&&{passive:!1,capture:!1},p=!(!l.passiveListener||!n.passiveListeners)&&{passive:!0,capture:!1};o&&(l.touch?(o.removeEventListener(i.start,e.scrollbar.onDragStart,d),o.removeEventListener(i.move,e.scrollbar.onDragMove,d),o.removeEventListener(i.end,e.scrollbar.onDragEnd,p)):(o.removeEventListener(s.start,e.scrollbar.onDragStart,d),t.removeEventListener(s.move,e.scrollbar.onDragMove,d),t.removeEventListener(s.end,e.scrollbar.onDragEnd,p)))}},init:function(){var e=this,t=e.scrollbar,a=e.$el;e.params.scrollbar=k(a,e.params.scrollbar,e.params.createElements,{el:"swiper-scrollbar"});var i=e.params.scrollbar;if(i.el){var s=m(i.el);e.params.uniqueNavElements&&"string"==typeof i.el&&s.length>1&&1===a.find(i.el).length&&(s=a.find(i.el));var r=s.find("."+e.params.scrollbar.dragClass);0===r.length&&(r=m('
'),s.append(r)),M(t,{$el:s,el:s[0],$dragEl:r,dragEl:r[0]}),i.draggable&&t.enableDraggable(),s&&s[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)}},destroy:function(){this.scrollbar.disableDraggable()}},ae={setTransform:function(e,t){var a=this.rtl,i=m(e),s=a?-1:1,r=i.attr("data-swiper-parallax")||"0",n=i.attr("data-swiper-parallax-x"),l=i.attr("data-swiper-parallax-y"),o=i.attr("data-swiper-parallax-scale"),d=i.attr("data-swiper-parallax-opacity");if(n||l?(n=n||"0",l=l||"0"):this.isHorizontal()?(n=r,l="0"):(l=r,n="0"),n=n.indexOf("%")>=0?parseInt(n,10)*t*s+"%":n*t*s+"px",l=l.indexOf("%")>=0?parseInt(l,10)*t+"%":l*t+"px",null!=d){var p=d-(d-1)*(1-Math.abs(t));i[0].style.opacity=p}if(null==o)i.transform("translate3d("+n+", "+l+", 0px)");else{var u=o-(o-1)*(1-Math.abs(t));i.transform("translate3d("+n+", "+l+", 0px) scale("+u+")")}},setTranslate:function(){var e=this,t=e.$el,a=e.slides,i=e.progress,s=e.snapGrid;t.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t){e.parallax.setTransform(t,i)})),a.each((function(t,a){var r=t.progress;e.params.slidesPerGroup>1&&"auto"!==e.params.slidesPerView&&(r+=Math.ceil(a/2)-i*(s.length-1)),r=Math.min(Math.max(r,-1),1),m(t).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t){e.parallax.setTransform(t,r)}))}))},setTransition:function(e){void 0===e&&(e=this.params.speed);this.$el.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]").each((function(t){var a=m(t),i=parseInt(a.attr("data-swiper-parallax-duration"),10)||e;0===e&&(i=0),a.transition(i)}))}},ie={getDistanceBetweenTouches:function(e){if(e.targetTouches.length<2)return 1;var t=e.targetTouches[0].pageX,a=e.targetTouches[0].pageY,i=e.targetTouches[1].pageX,s=e.targetTouches[1].pageY;return Math.sqrt(Math.pow(i-t,2)+Math.pow(s-a,2))},onGestureStart:function(e){var t=this,a=t.support,i=t.params.zoom,s=t.zoom,r=s.gesture;if(s.fakeGestureTouched=!1,s.fakeGestureMoved=!1,!a.gestures){if("touchstart"!==e.type||"touchstart"===e.type&&e.targetTouches.length<2)return;s.fakeGestureTouched=!0,r.scaleStart=ie.getDistanceBetweenTouches(e)}r.$slideEl&&r.$slideEl.length||(r.$slideEl=m(e.target).closest("."+t.params.slideClass),0===r.$slideEl.length&&(r.$slideEl=t.slides.eq(t.activeIndex)),r.$imageEl=r.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),r.$imageWrapEl=r.$imageEl.parent("."+i.containerClass),r.maxRatio=r.$imageWrapEl.attr("data-swiper-zoom")||i.maxRatio,0!==r.$imageWrapEl.length)?(r.$imageEl&&r.$imageEl.transition(0),t.zoom.isScaling=!0):r.$imageEl=void 0},onGestureChange:function(e){var t=this,a=t.support,i=t.params.zoom,s=t.zoom,r=s.gesture;if(!a.gestures){if("touchmove"!==e.type||"touchmove"===e.type&&e.targetTouches.length<2)return;s.fakeGestureMoved=!0,r.scaleMove=ie.getDistanceBetweenTouches(e)}r.$imageEl&&0!==r.$imageEl.length?(a.gestures?s.scale=e.scale*s.currentScale:s.scale=r.scaleMove/r.scaleStart*s.currentScale,s.scale>r.maxRatio&&(s.scale=r.maxRatio-1+Math.pow(s.scale-r.maxRatio+1,.5)),s.scales.touchesStart.x))return void(s.isTouched=!1);if(!t.isHorizontal()&&(Math.floor(s.minY)===Math.floor(s.startY)&&s.touchesCurrent.ys.touchesStart.y))return void(s.isTouched=!1)}e.cancelable&&e.preventDefault(),e.stopPropagation(),s.isMoved=!0,s.currentX=s.touchesCurrent.x-s.touchesStart.x+s.startX,s.currentY=s.touchesCurrent.y-s.touchesStart.y+s.startY,s.currentXs.maxX&&(s.currentX=s.maxX-1+Math.pow(s.currentX-s.maxX+1,.8)),s.currentYs.maxY&&(s.currentY=s.maxY-1+Math.pow(s.currentY-s.maxY+1,.8)),r.prevPositionX||(r.prevPositionX=s.touchesCurrent.x),r.prevPositionY||(r.prevPositionY=s.touchesCurrent.y),r.prevTime||(r.prevTime=Date.now()),r.x=(s.touchesCurrent.x-r.prevPositionX)/(Date.now()-r.prevTime)/2,r.y=(s.touchesCurrent.y-r.prevPositionY)/(Date.now()-r.prevTime)/2,Math.abs(s.touchesCurrent.x-r.prevPositionX)<2&&(r.x=0),Math.abs(s.touchesCurrent.y-r.prevPositionY)<2&&(r.y=0),r.prevPositionX=s.touchesCurrent.x,r.prevPositionY=s.touchesCurrent.y,r.prevTime=Date.now(),i.$imageWrapEl.transform("translate3d("+s.currentX+"px, "+s.currentY+"px,0)")}}},onTouchEnd:function(){var e=this.zoom,t=e.gesture,a=e.image,i=e.velocity;if(t.$imageEl&&0!==t.$imageEl.length){if(!a.isTouched||!a.isMoved)return a.isTouched=!1,void(a.isMoved=!1);a.isTouched=!1,a.isMoved=!1;var s=300,r=300,n=i.x*s,l=a.currentX+n,o=i.y*r,d=a.currentY+o;0!==i.x&&(s=Math.abs((l-a.currentX)/i.x)),0!==i.y&&(r=Math.abs((d-a.currentY)/i.y));var p=Math.max(s,r);a.currentX=l,a.currentY=d;var u=a.width*e.scale,c=a.height*e.scale;a.minX=Math.min(t.slideWidth/2-u/2,0),a.maxX=-a.minX,a.minY=Math.min(t.slideHeight/2-c/2,0),a.maxY=-a.minY,a.currentX=Math.max(Math.min(a.currentX,a.maxX),a.minX),a.currentY=Math.max(Math.min(a.currentY,a.maxY),a.minY),t.$imageWrapEl.transition(p).transform("translate3d("+a.currentX+"px, "+a.currentY+"px,0)")}},onTransitionEnd:function(){var e=this,t=e.zoom,a=t.gesture;a.$slideEl&&e.previousIndex!==e.activeIndex&&(a.$imageEl&&a.$imageEl.transform("translate3d(0,0,0) scale(1)"),a.$imageWrapEl&&a.$imageWrapEl.transform("translate3d(0,0,0)"),t.scale=1,t.currentScale=1,a.$slideEl=void 0,a.$imageEl=void 0,a.$imageWrapEl=void 0)},toggle:function(e){var t=this.zoom;t.scale&&1!==t.scale?t.out():t.in(e)},in:function(e){var t,a,i,s,r,n,o,d,p,u,c,h,v,f,g,b,w=this,y=l(),E=w.zoom,x=w.params.zoom,T=E.gesture,C=E.image;(T.$slideEl||(e&&e.target&&(T.$slideEl=m(e.target).closest("."+w.params.slideClass)),T.$slideEl||(w.params.virtual&&w.params.virtual.enabled&&w.virtual?T.$slideEl=w.$wrapperEl.children("."+w.params.slideActiveClass):T.$slideEl=w.slides.eq(w.activeIndex)),T.$imageEl=T.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),T.$imageWrapEl=T.$imageEl.parent("."+x.containerClass)),T.$imageEl&&0!==T.$imageEl.length&&T.$imageWrapEl&&0!==T.$imageWrapEl.length)&&(T.$slideEl.addClass(""+x.zoomedSlideClass),void 0===C.touchesStart.x&&e?(t="touchend"===e.type?e.changedTouches[0].pageX:e.pageX,a="touchend"===e.type?e.changedTouches[0].pageY:e.pageY):(t=C.touchesStart.x,a=C.touchesStart.y),E.scale=T.$imageWrapEl.attr("data-swiper-zoom")||x.maxRatio,E.currentScale=T.$imageWrapEl.attr("data-swiper-zoom")||x.maxRatio,e?(g=T.$slideEl[0].offsetWidth,b=T.$slideEl[0].offsetHeight,i=T.$slideEl.offset().left+y.scrollX+g/2-t,s=T.$slideEl.offset().top+y.scrollY+b/2-a,o=T.$imageEl[0].offsetWidth,d=T.$imageEl[0].offsetHeight,p=o*E.scale,u=d*E.scale,v=-(c=Math.min(g/2-p/2,0)),f=-(h=Math.min(b/2-u/2,0)),(r=i*E.scale)v&&(r=v),(n=s*E.scale)f&&(n=f)):(r=0,n=0),T.$imageWrapEl.transition(300).transform("translate3d("+r+"px, "+n+"px,0)"),T.$imageEl.transition(300).transform("translate3d(0,0,0) scale("+E.scale+")"))},out:function(){var e=this,t=e.zoom,a=e.params.zoom,i=t.gesture;i.$slideEl||(e.params.virtual&&e.params.virtual.enabled&&e.virtual?i.$slideEl=e.$wrapperEl.children("."+e.params.slideActiveClass):i.$slideEl=e.slides.eq(e.activeIndex),i.$imageEl=i.$slideEl.find("img, svg, canvas, picture, .swiper-zoom-target"),i.$imageWrapEl=i.$imageEl.parent("."+a.containerClass)),i.$imageEl&&0!==i.$imageEl.length&&i.$imageWrapEl&&0!==i.$imageWrapEl.length&&(t.scale=1,t.currentScale=1,i.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),i.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),i.$slideEl.removeClass(""+a.zoomedSlideClass),i.$slideEl=void 0)},toggleGestures:function(e){var t=this,a=t.zoom,i=a.slideSelector,s=a.passiveListener;t.$wrapperEl[e]("gesturestart",i,a.onGestureStart,s),t.$wrapperEl[e]("gesturechange",i,a.onGestureChange,s),t.$wrapperEl[e]("gestureend",i,a.onGestureEnd,s)},enableGestures:function(){this.zoom.gesturesEnabled||(this.zoom.gesturesEnabled=!0,this.zoom.toggleGestures("on"))},disableGestures:function(){this.zoom.gesturesEnabled&&(this.zoom.gesturesEnabled=!1,this.zoom.toggleGestures("off"))},enable:function(){var e=this,t=e.support,a=e.zoom;if(!a.enabled){a.enabled=!0;var i=!("touchstart"!==e.touchEvents.start||!t.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1},s=!t.passiveListener||{passive:!1,capture:!0},r="."+e.params.slideClass;e.zoom.passiveListener=i,e.zoom.slideSelector=r,t.gestures?(e.$wrapperEl.on(e.touchEvents.start,e.zoom.enableGestures,i),e.$wrapperEl.on(e.touchEvents.end,e.zoom.disableGestures,i)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.on(e.touchEvents.start,r,a.onGestureStart,i),e.$wrapperEl.on(e.touchEvents.move,r,a.onGestureChange,s),e.$wrapperEl.on(e.touchEvents.end,r,a.onGestureEnd,i),e.touchEvents.cancel&&e.$wrapperEl.on(e.touchEvents.cancel,r,a.onGestureEnd,i)),e.$wrapperEl.on(e.touchEvents.move,"."+e.params.zoom.containerClass,a.onTouchMove,s)}},disable:function(){var e=this,t=e.zoom;if(t.enabled){var a=e.support;e.zoom.enabled=!1;var i=!("touchstart"!==e.touchEvents.start||!a.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1},s=!a.passiveListener||{passive:!1,capture:!0},r="."+e.params.slideClass;a.gestures?(e.$wrapperEl.off(e.touchEvents.start,e.zoom.enableGestures,i),e.$wrapperEl.off(e.touchEvents.end,e.zoom.disableGestures,i)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.off(e.touchEvents.start,r,t.onGestureStart,i),e.$wrapperEl.off(e.touchEvents.move,r,t.onGestureChange,s),e.$wrapperEl.off(e.touchEvents.end,r,t.onGestureEnd,i),e.touchEvents.cancel&&e.$wrapperEl.off(e.touchEvents.cancel,r,t.onGestureEnd,i)),e.$wrapperEl.off(e.touchEvents.move,"."+e.params.zoom.containerClass,t.onTouchMove,s)}}},se={loadInSlide:function(e,t){void 0===t&&(t=!0);var a=this,i=a.params.lazy;if(void 0!==e&&0!==a.slides.length){var s=a.virtual&&a.params.virtual.enabled?a.$wrapperEl.children("."+a.params.slideClass+'[data-swiper-slide-index="'+e+'"]'):a.slides.eq(e),r=s.find("."+i.elementClass+":not(."+i.loadedClass+"):not(."+i.loadingClass+")");!s.hasClass(i.elementClass)||s.hasClass(i.loadedClass)||s.hasClass(i.loadingClass)||r.push(s[0]),0!==r.length&&r.each((function(e){var r=m(e);r.addClass(i.loadingClass);var n=r.attr("data-background"),l=r.attr("data-src"),o=r.attr("data-srcset"),d=r.attr("data-sizes"),p=r.parent("picture");a.loadImage(r[0],l||n,o,d,!1,(function(){if(null!=a&&a&&(!a||a.params)&&!a.destroyed){if(n?(r.css("background-image",'url("'+n+'")'),r.removeAttr("data-background")):(o&&(r.attr("srcset",o),r.removeAttr("data-srcset")),d&&(r.attr("sizes",d),r.removeAttr("data-sizes")),p.length&&p.children("source").each((function(e){var t=m(e);t.attr("data-srcset")&&(t.attr("srcset",t.attr("data-srcset")),t.removeAttr("data-srcset"))})),l&&(r.attr("src",l),r.removeAttr("data-src"))),r.addClass(i.loadedClass).removeClass(i.loadingClass),s.find("."+i.preloaderClass).remove(),a.params.loop&&t){var e=s.attr("data-swiper-slide-index");if(s.hasClass(a.params.slideDuplicateClass)){var u=a.$wrapperEl.children('[data-swiper-slide-index="'+e+'"]:not(.'+a.params.slideDuplicateClass+")");a.lazy.loadInSlide(u.index(),!1)}else{var c=a.$wrapperEl.children("."+a.params.slideDuplicateClass+'[data-swiper-slide-index="'+e+'"]');a.lazy.loadInSlide(c.index(),!1)}}a.emit("lazyImageReady",s[0],r[0]),a.params.autoHeight&&a.updateAutoHeight()}})),a.emit("lazyImageLoad",s[0],r[0])}))}},load:function(){var e=this,t=e.$wrapperEl,a=e.params,i=e.slides,s=e.activeIndex,r=e.virtual&&a.virtual.enabled,n=a.lazy,l=a.slidesPerView;function o(e){if(r){if(t.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]').length)return!0}else if(i[e])return!0;return!1}function d(e){return r?m(e).attr("data-swiper-slide-index"):m(e).index()}if("auto"===l&&(l=0),e.lazy.initialImageLoaded||(e.lazy.initialImageLoaded=!0),e.params.watchSlidesVisibility)t.children("."+a.slideVisibleClass).each((function(t){var a=r?m(t).attr("data-swiper-slide-index"):m(t).index();e.lazy.loadInSlide(a)}));else if(l>1)for(var p=s;p1||n.loadPrevNextAmount&&n.loadPrevNextAmount>1){for(var u=n.loadPrevNextAmount,c=l,h=Math.min(s+c+Math.max(u,c),i.length),v=Math.max(s-Math.max(c,u),0),f=s+l;f0&&e.lazy.loadInSlide(d(b));var w=t.children("."+a.slidePrevClass);w.length>0&&e.lazy.loadInSlide(d(w))}},checkInViewOnLoad:function(){var e=l(),t=this;if(t&&!t.destroyed){var a=t.params.lazy.scrollingElement?m(t.params.lazy.scrollingElement):m(e),i=a[0]===e,s=i?e.innerWidth:a[0].offsetWidth,r=i?e.innerHeight:a[0].offsetHeight,n=t.$el.offset(),o=!1;t.rtlTranslate&&(n.left-=t.$el[0].scrollLeft);for(var d=[[n.left,n.top],[n.left+t.width,n.top],[n.left,n.top+t.height],[n.left+t.width,n.top+t.height]],p=0;p=0&&u[0]<=s&&u[1]>=0&&u[1]<=r){if(0===u[0]&&0===u[1])continue;o=!0}}var c=!("touchstart"!==t.touchEvents.start||!t.support.passiveListener||!t.params.passiveListeners)&&{passive:!0,capture:!1};o?(t.lazy.load(),a.off("scroll",t.lazy.checkInViewOnLoad,c)):t.lazy.scrollHandlerAttached||(t.lazy.scrollHandlerAttached=!0,a.on("scroll",t.lazy.checkInViewOnLoad,c))}}},re={LinearSpline:function(e,t){var a,i,s,r,n,l=function(e,t){for(i=-1,a=e.length;a-i>1;)e[s=a+i>>1]<=t?i=s:a=s;return a};return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(n=l(this.x,e),r=n-1,(e-this.x[r])*(this.y[n]-this.y[r])/(this.x[n]-this.x[r])+this.y[r]):0},this},getInterpolateFunction:function(e){var t=this;t.controller.spline||(t.controller.spline=t.params.loop?new re.LinearSpline(t.slidesGrid,e.slidesGrid):new re.LinearSpline(t.snapGrid,e.snapGrid))},setTranslate:function(e,t){var a,i,s=this,r=s.controller.control,n=s.constructor;function l(e){var t=s.rtlTranslate?-s.translate:s.translate;"slide"===s.params.controller.by&&(s.controller.getInterpolateFunction(e),i=-s.controller.spline.interpolate(-t)),i&&"container"!==s.params.controller.by||(a=(e.maxTranslate()-e.minTranslate())/(s.maxTranslate()-s.minTranslate()),i=(t-s.minTranslate())*a+e.minTranslate()),s.params.controller.inverse&&(i=e.maxTranslate()-i),e.updateProgress(i),e.setTranslate(i,s),e.updateActiveIndex(),e.updateSlidesClasses()}if(Array.isArray(r))for(var o=0;o0&&(e.isBeginning?(e.a11y.disableEl(i),e.a11y.makeElNotFocusable(i)):(e.a11y.enableEl(i),e.a11y.makeElFocusable(i))),a&&a.length>0&&(e.isEnd?(e.a11y.disableEl(a),e.a11y.makeElNotFocusable(a)):(e.a11y.enableEl(a),e.a11y.makeElFocusable(a)))}},updatePagination:function(){var e=this,t=e.params.a11y;e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length&&e.pagination.bullets.each((function(a){var i=m(a);e.a11y.makeElFocusable(i),e.params.pagination.renderBullet||(e.a11y.addElRole(i,"button"),e.a11y.addElLabel(i,t.paginationBulletMessage.replace(/\{\{index\}\}/,i.index()+1)))}))},init:function(){var e=this,t=e.params.a11y;e.$el.append(e.a11y.liveRegion);var a=e.$el;t.containerRoleDescriptionMessage&&e.a11y.addElRoleDescription(a,t.containerRoleDescriptionMessage),t.containerMessage&&e.a11y.addElLabel(a,t.containerMessage);var i=e.$wrapperEl,s=i.attr("id")||"swiper-wrapper-"+e.a11y.getRandomNumber(16),r=e.params.autoplay&&e.params.autoplay.enabled?"off":"polite";e.a11y.addElId(i,s),e.a11y.addElLive(i,r),t.itemRoleDescriptionMessage&&e.a11y.addElRoleDescription(m(e.slides),t.itemRoleDescriptionMessage),e.a11y.addElRole(m(e.slides),t.slideRole);var n,l,o=e.params.loop?e.slides.filter((function(t){return!t.classList.contains(e.params.slideDuplicateClass)})).length:e.slides.length;e.slides.each((function(a,i){var s=m(a),r=e.params.loop?parseInt(s.attr("data-swiper-slide-index"),10):i,n=t.slideLabelMessage.replace(/\{\{index\}\}/,r+1).replace(/\{\{slidesLength\}\}/,o);e.a11y.addElLabel(s,n)})),e.navigation&&e.navigation.$nextEl&&(n=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(l=e.navigation.$prevEl),n&&n.length&&(e.a11y.makeElFocusable(n),"BUTTON"!==n[0].tagName&&(e.a11y.addElRole(n,"button"),n.on("keydown",e.a11y.onEnterOrSpaceKey)),e.a11y.addElLabel(n,t.nextSlideMessage),e.a11y.addElControls(n,s)),l&&l.length&&(e.a11y.makeElFocusable(l),"BUTTON"!==l[0].tagName&&(e.a11y.addElRole(l,"button"),l.on("keydown",e.a11y.onEnterOrSpaceKey)),e.a11y.addElLabel(l,t.prevSlideMessage),e.a11y.addElControls(l,s)),e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length&&e.pagination.$el.on("keydown",P(e.params.pagination.bulletClass),e.a11y.onEnterOrSpaceKey)},destroy:function(){var e,t,a=this;a.a11y.liveRegion&&a.a11y.liveRegion.length>0&&a.a11y.liveRegion.remove(),a.navigation&&a.navigation.$nextEl&&(e=a.navigation.$nextEl),a.navigation&&a.navigation.$prevEl&&(t=a.navigation.$prevEl),e&&e.off("keydown",a.a11y.onEnterOrSpaceKey),t&&t.off("keydown",a.a11y.onEnterOrSpaceKey),a.pagination&&a.params.pagination.clickable&&a.pagination.bullets&&a.pagination.bullets.length&&a.pagination.$el.off("keydown",P(a.params.pagination.bulletClass),a.a11y.onEnterOrSpaceKey)}},le={init:function(){var e=this,t=l();if(e.params.history){if(!t.history||!t.history.pushState)return e.params.history.enabled=!1,void(e.params.hashNavigation.enabled=!0);var a=e.history;a.initialized=!0,a.paths=le.getPathValues(e.params.url),(a.paths.key||a.paths.value)&&(a.scrollToSlide(0,a.paths.value,e.params.runCallbacksOnInit),e.params.history.replaceState||t.addEventListener("popstate",e.history.setHistoryPopState))}},destroy:function(){var e=l();this.params.history.replaceState||e.removeEventListener("popstate",this.history.setHistoryPopState)},setHistoryPopState:function(){var e=this;e.history.paths=le.getPathValues(e.params.url),e.history.scrollToSlide(e.params.speed,e.history.paths.value,!1)},getPathValues:function(e){var t=l(),a=(e?new URL(e):t.location).pathname.slice(1).split("/").filter((function(e){return""!==e})),i=a.length;return{key:a[i-2],value:a[i-1]}},setHistory:function(e,t){var a=this,i=l();if(a.history.initialized&&a.params.history.enabled){var s;s=a.params.url?new URL(a.params.url):i.location;var r=a.slides.eq(t),n=le.slugify(r.attr("data-history"));if(a.params.history.root.length>0){var o=a.params.history.root;"/"===o[o.length-1]&&(o=o.slice(0,o.length-1)),n=o+"/"+e+"/"+n}else s.pathname.includes(e)||(n=e+"/"+n);var d=i.history.state;d&&d.value===n||(a.params.history.replaceState?i.history.replaceState({value:n},null,n):i.history.pushState({value:n},null,n))}},slugify:function(e){return e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,"")},scrollToSlide:function(e,t,a){var i=this;if(t)for(var s=0,r=i.slides.length;s'),i.append(e)),e.css({height:r+"px"})):0===(e=a.find(".swiper-cube-shadow")).length&&(e=m('
'),a.append(e)));for(var v=0;v-1&&(h=90*g+90*y,l&&(h=90*-g-90*y)),f.transform(C),p.slideShadows){var S=u?f.find(".swiper-slide-shadow-left"):f.find(".swiper-slide-shadow-top"),M=u?f.find(".swiper-slide-shadow-right"):f.find(".swiper-slide-shadow-bottom");0===S.length&&(S=m('
'),f.append(S)),0===M.length&&(M=m('
'),f.append(M)),S.length&&(S[0].style.opacity=Math.max(-y,0)),M.length&&(M[0].style.opacity=Math.max(y,0))}}if(i.css({"-webkit-transform-origin":"50% 50% -"+o/2+"px","-moz-transform-origin":"50% 50% -"+o/2+"px","-ms-transform-origin":"50% 50% -"+o/2+"px","transform-origin":"50% 50% -"+o/2+"px"}),p.shadow)if(u)e.transform("translate3d(0px, "+(r/2+p.shadowOffset)+"px, "+-r/2+"px) rotateX(90deg) rotateZ(0deg) scale("+p.shadowScale+")");else{var z=Math.abs(h)-90*Math.floor(Math.abs(h)/90),P=1.5-(Math.sin(2*z*Math.PI/360)/2+Math.cos(2*z*Math.PI/360)/2),k=p.shadowScale,$=p.shadowScale/P,L=p.shadowOffset;e.transform("scale3d("+k+", 1, "+$+") translate3d(0px, "+(n/2+L)+"px, "+-n/2/$+"px) rotateX(-90deg)")}var I=d.isSafari||d.isWebView?-o/2:0;i.transform("translate3d(0px,0,"+I+"px) rotateX("+(t.isHorizontal()?0:h)+"deg) rotateY("+(t.isHorizontal()?-h:0)+"deg)")},setTransition:function(e){var t=this,a=t.$el;t.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),t.params.cubeEffect.shadow&&!t.isHorizontal()&&a.find(".swiper-cube-shadow").transition(e)}},ce={setTranslate:function(){for(var e=this,t=e.slides,a=e.rtlTranslate,i=0;i'),s.append(p)),0===u.length&&(u=m('
'),s.append(u)),p.length&&(p[0].style.opacity=Math.max(-r,0)),u.length&&(u[0].style.opacity=Math.max(r,0))}s.transform("translate3d("+o+"px, "+d+"px, 0px) rotateX("+l+"deg) rotateY("+n+"deg)")}},setTransition:function(e){var t=this,a=t.slides,i=t.activeIndex,s=t.$wrapperEl;if(a.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),t.params.virtualTranslate&&0!==e){var r=!1;a.eq(i).transitionEnd((function(){if(!r&&t&&!t.destroyed){r=!0,t.animating=!1;for(var e=["webkitTransitionEnd","transitionend"],a=0;a'),h.append(S)),0===M.length&&(M=m('
'),h.append(M)),S.length&&(S[0].style.opacity=f>0?f:0),M.length&&(M[0].style.opacity=-f>0?-f:0)}}},setTransition:function(e){this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e)}},ve={init:function(){var e=this,t=e.params.thumbs;if(e.thumbs.initialized)return!1;e.thumbs.initialized=!0;var a=e.constructor;return t.swiper instanceof a?(e.thumbs.swiper=t.swiper,M(e.thumbs.swiper.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),M(e.thumbs.swiper.params,{watchSlidesProgress:!0,slideToClickedSlide:!1})):C(t.swiper)&&(e.thumbs.swiper=new a(M({},t.swiper,{watchSlidesVisibility:!0,watchSlidesProgress:!0,slideToClickedSlide:!1})),e.thumbs.swiperCreated=!0),e.thumbs.swiper.$el.addClass(e.params.thumbs.thumbsContainerClass),e.thumbs.swiper.on("tap",e.thumbs.onThumbClick),!0},onThumbClick:function(){var e=this,t=e.thumbs.swiper;if(t){var a=t.clickedIndex,i=t.clickedSlide;if(!(i&&m(i).hasClass(e.params.thumbs.slideThumbActiveClass)||null==a)){var s;if(s=t.params.loop?parseInt(m(t.clickedSlide).attr("data-swiper-slide-index"),10):a,e.params.loop){var r=e.activeIndex;e.slides.eq(r).hasClass(e.params.slideDuplicateClass)&&(e.loopFix(),e._clientLeft=e.$wrapperEl[0].clientLeft,r=e.activeIndex);var n=e.slides.eq(r).prevAll('[data-swiper-slide-index="'+s+'"]').eq(0).index(),l=e.slides.eq(r).nextAll('[data-swiper-slide-index="'+s+'"]').eq(0).index();s=void 0===n?l:void 0===l?n:l-r1?p:o:p-ot.previousIndex?"next":"prev"}else l=(n=t.realIndex)>t.previousIndex?"next":"prev";r&&(n+="next"===l?s:-1*s),a.visibleSlidesIndexes&&a.visibleSlidesIndexes.indexOf(n)<0&&(a.params.centeredSlides?n=n>o?n-Math.floor(i/2)+1:n+Math.floor(i/2)-1:n>o&&a.params.slidesPerGroup,a.slideTo(n,e?0:void 0))}var u=1,c=t.params.thumbs.slideThumbActiveClass;if(t.params.slidesPerView>1&&!t.params.centeredSlides&&(u=t.params.slidesPerView),t.params.thumbs.multipleActiveThumbs||(u=1),u=Math.floor(u),a.slides.removeClass(c),a.params.loop||a.params.virtual&&a.params.virtual.enabled)for(var h=0;h0&&!m(a).hasClass(e.params.pagination.bulletClass)){if(e.navigation&&(e.navigation.nextEl&&a===e.navigation.nextEl||e.navigation.prevEl&&a===e.navigation.prevEl))return;!0===e.pagination.$el.hasClass(e.params.pagination.hiddenClass)?e.emit("paginationShow"):e.emit("paginationHide"),e.pagination.$el.toggleClass(e.params.pagination.hiddenClass)}}}},{name:"scrollbar",params:{scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag"}},create:function(){z(this,{scrollbar:t({isTouched:!1,timeout:null,dragTimeout:null},te)})},on:{init:function(e){e.scrollbar.init(),e.scrollbar.updateSize(),e.scrollbar.setTranslate()},update:function(e){e.scrollbar.updateSize()},resize:function(e){e.scrollbar.updateSize()},observerUpdate:function(e){e.scrollbar.updateSize()},setTranslate:function(e){e.scrollbar.setTranslate()},setTransition:function(e,t){e.scrollbar.setTransition(t)},"enable disable":function(e){var t=e.scrollbar.$el;t&&t[e.enabled?"removeClass":"addClass"](e.params.scrollbar.lockClass)},destroy:function(e){e.scrollbar.destroy()}}},{name:"parallax",params:{parallax:{enabled:!1}},create:function(){z(this,{parallax:t({},ae)})},on:{beforeInit:function(e){e.params.parallax.enabled&&(e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)},init:function(e){e.params.parallax.enabled&&e.parallax.setTranslate()},setTranslate:function(e){e.params.parallax.enabled&&e.parallax.setTranslate()},setTransition:function(e,t){e.params.parallax.enabled&&e.parallax.setTransition(t)}}},{name:"zoom",params:{zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}},create:function(){var e=this;z(e,{zoom:t({enabled:!1,scale:1,currentScale:1,isScaling:!1,gesture:{$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},image:{isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},velocity:{x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0}},ie)});var a=1;Object.defineProperty(e.zoom,"scale",{get:function(){return a},set:function(t){if(a!==t){var i=e.zoom.gesture.$imageEl?e.zoom.gesture.$imageEl[0]:void 0,s=e.zoom.gesture.$slideEl?e.zoom.gesture.$slideEl[0]:void 0;e.emit("zoomChange",t,i,s)}a=t}})},on:{init:function(e){e.params.zoom.enabled&&e.zoom.enable()},destroy:function(e){e.zoom.disable()},touchStart:function(e,t){e.zoom.enabled&&e.zoom.onTouchStart(t)},touchEnd:function(e,t){e.zoom.enabled&&e.zoom.onTouchEnd(t)},doubleTap:function(e,t){!e.animating&&e.params.zoom.enabled&&e.zoom.enabled&&e.params.zoom.toggle&&e.zoom.toggle(t)},transitionEnd:function(e){e.zoom.enabled&&e.params.zoom.enabled&&e.zoom.onTransitionEnd()},slideChange:function(e){e.zoom.enabled&&e.params.zoom.enabled&&e.params.cssMode&&e.zoom.onTransitionEnd()}}},{name:"lazy",params:{lazy:{checkInView:!1,enabled:!1,loadPrevNext:!1,loadPrevNextAmount:1,loadOnTransitionStart:!1,scrollingElement:"",elementClass:"swiper-lazy",loadingClass:"swiper-lazy-loading",loadedClass:"swiper-lazy-loaded",preloaderClass:"swiper-lazy-preloader"}},create:function(){z(this,{lazy:t({initialImageLoaded:!1},se)})},on:{beforeInit:function(e){e.params.lazy.enabled&&e.params.preloadImages&&(e.params.preloadImages=!1)},init:function(e){e.params.lazy.enabled&&!e.params.loop&&0===e.params.initialSlide&&(e.params.lazy.checkInView?e.lazy.checkInViewOnLoad():e.lazy.load())},scroll:function(e){e.params.freeMode&&!e.params.freeModeSticky&&e.lazy.load()},"scrollbarDragMove resize _freeModeNoMomentumRelease":function(e){e.params.lazy.enabled&&e.lazy.load()},transitionStart:function(e){e.params.lazy.enabled&&(e.params.lazy.loadOnTransitionStart||!e.params.lazy.loadOnTransitionStart&&!e.lazy.initialImageLoaded)&&e.lazy.load()},transitionEnd:function(e){e.params.lazy.enabled&&!e.params.lazy.loadOnTransitionStart&&e.lazy.load()},slideChange:function(e){var t=e.params,a=t.lazy,i=t.cssMode,s=t.watchSlidesVisibility,r=t.watchSlidesProgress,n=t.touchReleaseOnEdges,l=t.resistanceRatio;a.enabled&&(i||(s||r)&&(n||0===l))&&e.lazy.load()}}},{name:"controller",params:{controller:{control:void 0,inverse:!1,by:"slide"}},create:function(){z(this,{controller:t({control:this.params.controller.control},re)})},on:{update:function(e){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)},resize:function(e){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)},observerUpdate:function(e){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)},setTranslate:function(e,t,a){e.controller.control&&e.controller.setTranslate(t,a)},setTransition:function(e,t,a){e.controller.control&&e.controller.setTransition(t,a)}}},{name:"a11y",params:{a11y:{enabled:!0,notificationClass:"swiper-notification",prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}",slideLabelMessage:"{{index}} / {{slidesLength}}",containerMessage:null,containerRoleDescriptionMessage:null,itemRoleDescriptionMessage:null,slideRole:"group"}},create:function(){z(this,{a11y:t({},ne,{liveRegion:m('')})})},on:{afterInit:function(e){e.params.a11y.enabled&&(e.a11y.init(),e.a11y.updateNavigation())},toEdge:function(e){e.params.a11y.enabled&&e.a11y.updateNavigation()},fromEdge:function(e){e.params.a11y.enabled&&e.a11y.updateNavigation()},paginationUpdate:function(e){e.params.a11y.enabled&&e.a11y.updatePagination()},destroy:function(e){e.params.a11y.enabled&&e.a11y.destroy()}}},{name:"history",params:{history:{enabled:!1,root:"",replaceState:!1,key:"slides"}},create:function(){z(this,{history:t({},le)})},on:{init:function(e){e.params.history.enabled&&e.history.init()},destroy:function(e){e.params.history.enabled&&e.history.destroy()},"transitionEnd _freeModeNoMomentumRelease":function(e){e.history.initialized&&e.history.setHistory(e.params.history.key,e.activeIndex)},slideChange:function(e){e.history.initialized&&e.params.cssMode&&e.history.setHistory(e.params.history.key,e.activeIndex)}}},{name:"hash-navigation",params:{hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}},create:function(){z(this,{hashNavigation:t({initialized:!1},oe)})},on:{init:function(e){e.params.hashNavigation.enabled&&e.hashNavigation.init()},destroy:function(e){e.params.hashNavigation.enabled&&e.hashNavigation.destroy()},"transitionEnd _freeModeNoMomentumRelease":function(e){e.hashNavigation.initialized&&e.hashNavigation.setHash()},slideChange:function(e){e.hashNavigation.initialized&&e.params.cssMode&&e.hashNavigation.setHash()}}},{name:"autoplay",params:{autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}},create:function(){z(this,{autoplay:t({},de,{running:!1,paused:!1})})},on:{init:function(e){e.params.autoplay.enabled&&(e.autoplay.start(),r().addEventListener("visibilitychange",e.autoplay.onVisibilityChange),e.autoplay.attachMouseEvents())},beforeTransitionStart:function(e,t,a){e.autoplay.running&&(a||!e.params.autoplay.disableOnInteraction?e.autoplay.pause(t):e.autoplay.stop())},sliderFirstMove:function(e){e.autoplay.running&&(e.params.autoplay.disableOnInteraction?e.autoplay.stop():e.autoplay.pause())},touchEnd:function(e){e.params.cssMode&&e.autoplay.paused&&!e.params.autoplay.disableOnInteraction&&e.autoplay.run()},destroy:function(e){e.autoplay.detachMouseEvents(),e.autoplay.running&&e.autoplay.stop(),r().removeEventListener("visibilitychange",e.autoplay.onVisibilityChange)}}},{name:"effect-fade",params:{fadeEffect:{crossFade:!1}},create:function(){z(this,{fadeEffect:t({},pe)})},on:{beforeInit:function(e){if("fade"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"fade");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};M(e.params,t),M(e.originalParams,t)}},setTranslate:function(e){"fade"===e.params.effect&&e.fadeEffect.setTranslate()},setTransition:function(e,t){"fade"===e.params.effect&&e.fadeEffect.setTransition(t)}}},{name:"effect-cube",params:{cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}},create:function(){z(this,{cubeEffect:t({},ue)})},on:{beforeInit:function(e){if("cube"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"cube"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0};M(e.params,t),M(e.originalParams,t)}},setTranslate:function(e){"cube"===e.params.effect&&e.cubeEffect.setTranslate()},setTransition:function(e,t){"cube"===e.params.effect&&e.cubeEffect.setTransition(t)}}},{name:"effect-flip",params:{flipEffect:{slideShadows:!0,limitRotation:!0}},create:function(){z(this,{flipEffect:t({},ce)})},on:{beforeInit:function(e){if("flip"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"flip"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};M(e.params,t),M(e.originalParams,t)}},setTranslate:function(e){"flip"===e.params.effect&&e.flipEffect.setTranslate()},setTransition:function(e,t){"flip"===e.params.effect&&e.flipEffect.setTransition(t)}}},{name:"effect-coverflow",params:{coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0}},create:function(){z(this,{coverflowEffect:t({},he)})},on:{beforeInit:function(e){"coverflow"===e.params.effect&&(e.classNames.push(e.params.containerModifierClass+"coverflow"),e.classNames.push(e.params.containerModifierClass+"3d"),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)},setTranslate:function(e){"coverflow"===e.params.effect&&e.coverflowEffect.setTranslate()},setTransition:function(e,t){"coverflow"===e.params.effect&&e.coverflowEffect.setTransition(t)}}},{name:"thumbs",params:{thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-container-thumbs"}},create:function(){z(this,{thumbs:t({swiper:null,initialized:!1},ve)})},on:{beforeInit:function(e){var t=e.params.thumbs;t&&t.swiper&&(e.thumbs.init(),e.thumbs.update(!0))},slideChange:function(e){e.thumbs.swiper&&e.thumbs.update()},update:function(e){e.thumbs.swiper&&e.thumbs.update()},resize:function(e){e.thumbs.swiper&&e.thumbs.update()},observerUpdate:function(e){e.thumbs.swiper&&e.thumbs.update()},setTransition:function(e,t){var a=e.thumbs.swiper;a&&a.setTransition(t)},beforeDestroy:function(e){var t=e.thumbs.swiper;t&&e.thumbs.swiperCreated&&t&&t.destroy()}}}];return q.use(fe),q})); + +window.SEMICOLON_swiperInit = function( $sliderEl ){ + + $sliderEl = $sliderEl.filter(':not(.customjs)'); + + if( $sliderEl.length < 1 ){ + return true; + } + + $sliderEl.each( function(){ + if( !$(this).hasClass('swiper_wrapper') ) { + return true; + } + + if( $(this).find('.swiper-slide').length < 1 ) { + return true; + } + + let element = $(this).filter('.swiper_wrapper'), + elDirection = element.attr('data-direction') || 'horizontal', + elSpeed = element.attr('data-speed') || 300, + elAutoPlay = element.attr('data-autoplay'), + elLoop = element.attr('data-loop'), + elStart = element.attr('data-start') || 1, + elEffect = element.attr('data-effect') || 'slide', + elGrabCursor = element.attr('data-grab'), + elParallax = element.attr('data-parallax'), + slideNumberTotal = element.find('.slide-number-total'), + slideNumberCurrent = element.find('.slide-number-current'), + elVideoAutoPlay = element.attr('data-video-autoplay'), + elSettings = element.attr('data-settings'), + elPagination, elPaginationClickable; + + if( elAutoPlay ) { elAutoPlay = Number( elAutoPlay ); } else { elAutoPlay = 999999999; } + if( elLoop == 'true' ) { elLoop = true; } else { elLoop = false; } + if( elParallax == 'true' ) { elParallax = true; } else { elParallax = false; } + if( elGrabCursor == 'false' ) { elGrabCursor = false; } else { elGrabCursor = true; } + if( elVideoAutoPlay == 'false' ) { elVideoAutoPlay = false; } else { elVideoAutoPlay = true; } + + if( elStart === 'random' ) { + elStart = Math.floor( Math.random() * element.find('.swiper-slide:not(.swiper-slide-duplicate)').length ); + } else { + elStart = Number( elStart ) - 1; + } + + if( element.find('.swiper-pagination').length > 0 ) { + elPagination = element.find('.swiper-pagination').get(0); + elPaginationClickable = true; + } else { + elPagination = ''; + elPaginationClickable = false; + } + + let elementNavNext = element.find('.slider-arrow-right').get(0), + elementNavPrev = element.find('.slider-arrow-left').get(0), + elementScollBar = element.find('.swiper-scrollbar').get(0); + + let scwSwiperSlider = new Swiper( element.find('.swiper-parent').get(0) ,{ + direction: elDirection, + speed: Number( elSpeed ), + autoplay: { + delay: elAutoPlay + }, + loop: elLoop, + initialSlide: elStart, + effect: elEffect, + parallax: elParallax, + slidesPerView: 1, + grabCursor: elGrabCursor, + pagination: { + el: elPagination, + clickable: elPaginationClickable + }, + navigation: { + prevEl: elementNavPrev, + nextEl: elementNavNext + }, + scrollbar: { + el: elementScollBar + }, + on: { + afterInit: function(swiper){ + SEMICOLON.slider.sliderDimensions(); + element.find('.yt-bg-player').attr('data-autoplay', 'false').removeClass('customjs'); + SEMICOLON.widget.youtubeBgVideo({ parent: swiper }); + let activeYTVideo = $('.swiper-slide-active').find('.yt-bg-player.mb_YTPlayer:not(.customjs)'); + activeYTVideo.on( 'YTPReady', function(){ + setTimeout( function(){ + activeYTVideo.YTPPlay(); + }, 1000); + }); + $('.swiper-slide-active [data-animate]').each(function(){ + let $toAnimateElement = $(this), + toAnimateDelay = $toAnimateElement.attr('data-delay'), + toAnimateDelayTime = 0; + if( toAnimateDelay ) { toAnimateDelayTime = Number( toAnimateDelay ) + 750; } else { toAnimateDelayTime = 750; } + if( !$toAnimateElement.hasClass('animated') ) { + $toAnimateElement.addClass('not-animated'); + let elementAnimation = $toAnimateElement.attr('data-animate'); + setTimeout(function() { + $toAnimateElement.removeClass('not-animated').addClass( elementAnimation + ' animated'); + }, toAnimateDelayTime); + } + }); + element.find('[data-animate]').each(function(){ + let $toAnimateElement = $(this), + elementAnimation = $toAnimateElement.attr('data-animate'); + if( $toAnimateElement.parents('.swiper-slide').hasClass('swiper-slide-active') ) { return true; } + $toAnimateElement.removeClass('animated').removeClass(elementAnimation).addClass('not-animated'); + }); + SEMICOLON.slider.swiperSliderMenu(); + }, + transitionStart: function(swiper){ + if( slideNumberCurrent.length > 0 ){ + if( elLoop == true ) { + slideNumberCurrent.html( Number( element.find('.swiper-slide.swiper-slide-active').attr('data-swiper-slide-index') ) + 1 ); + } else { + slideNumberCurrent.html( scwSwiperSlider.activeIndex + 1 ); + } + } + element.find('[data-animate]').each(function(){ + let $toAnimateElement = $(this), + elementAnimation = $toAnimateElement.attr('data-animate'); + if( $toAnimateElement.parents('.swiper-slide').hasClass('swiper-slide-active') ) { return true; } + $toAnimateElement.removeClass('animated').removeClass(elementAnimation).addClass('not-animated'); + }); + SEMICOLON.slider.swiperSliderMenu(); + }, + transitionEnd: function(swiper){ + element.find('.swiper-slide').each(function(){ + let slideEl = $(this); + if( slideEl.find('video').length > 0 && elVideoAutoPlay == true ) { + slideEl.find('video').get(0).pause(); + } + if( slideEl.find('.yt-bg-player.mb_YTPlayer:not(.customjs)').length > 0 ) { + slideEl.find('.yt-bg-player.mb_YTPlayer:not(.customjs)').YTPPause(); + } + }); + element.find('.swiper-slide:not(".swiper-slide-active")').each(function(){ + let slideEl = $(this); + if( slideEl.find('video').length > 0 ) { + if( slideEl.find('video').get(0).currentTime != 0 ) { + slideEl.find('video').get(0).currentTime = 0; + } + } + if( slideEl.find('.yt-bg-player.mb_YTPlayer:not(.customjs)').length > 0 ) { + slideEl.find('.yt-bg-player.mb_YTPlayer:not(.customjs)').YTPSeekTo( slideEl.find('.yt-bg-player.mb_YTPlayer:not(.customjs)').attr('data-start') ); + } + }); + if( element.find('.swiper-slide.swiper-slide-active').find('video').length > 0 && elVideoAutoPlay == true ) { + element.find('.swiper-slide.swiper-slide-active').find('video').get(0).play(); + } + if( element.find('.swiper-slide.swiper-slide-active').find('.yt-bg-player.mb_YTPlayer:not(.customjs)').length > 0 && elVideoAutoPlay == true ) { + element.find('.swiper-slide.swiper-slide-active').find('.yt-bg-player.mb_YTPlayer:not(.customjs)').YTPPlay(); + } + + element.find('.swiper-slide.swiper-slide-active [data-animate]').each(function(){ + let $toAnimateElement = $(this), + toAnimateDelay = $toAnimateElement.attr('data-delay'), + toAnimateDelayTime = 0; + if( toAnimateDelay ) { toAnimateDelayTime = Number( toAnimateDelay ) + 300; } else { toAnimateDelayTime = 300; } + if( !$toAnimateElement.hasClass('animated') ) { + $toAnimateElement.addClass('not-animated'); + let elementAnimation = $toAnimateElement.attr('data-animate'); + setTimeout(function() { + $toAnimateElement.removeClass('not-animated').addClass( elementAnimation + ' animated'); + }, toAnimateDelayTime); + } + }); + } + } + }); + + if( slideNumberCurrent.length > 0 ) { + if( elLoop == true ) { + slideNumberCurrent.html( scwSwiperSlider.realIndex + 1 ); + } else { + slideNumberCurrent.html( scwSwiperSlider.activeIndex + 1 ); + } + } + + if( slideNumberTotal.length > 0 ) { + slideNumberTotal.html( element.find('.swiper-slide:not(.swiper-slide-duplicate)').length ); + } + + if( elSettings ){ + elSettings = Function( 'return ' + elSettings )(); + Object.keys(elSettings).forEach( function( key, index ){ + scwSwiperSlider.params[key] = elSettings[key]; + scwSwiperSlider.update(); + }); + } + }); + +}; + + + +/*! jQuery UI - v1.12.1 - 2018-01-02 +* http://jqueryui.com +* Includes: widget.js, keycode.js, unique-id.js, widgets/tabs.js, effect.js, effects/effect-fade.js, effects/effect-slide.js +* Copyright jQuery Foundation and other contributors; Licensed MIT */ +(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){t.ui=t.ui||{},t.ui.version="1.12.1";var e=0,i=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},l=e.split(".")[0];e=e.split(".")[1];var h=l+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][h.toLowerCase()]=function(e){return!!t.data(e,h)},t[l]=t[l]||{},n=t[l][e],o=t[l][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:l,widgetName:e,widgetFullName:h}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var s,n,o=i.call(arguments,1),a=0,r=o.length;r>a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,t.ui.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},t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.widget("ui.tabs",{version:"1.12.1",delay:300,options:{active:null,classes:{"ui-tabs":"ui-corner-all","ui-tabs-nav":"ui-corner-all","ui-tabs-panel":"ui-corner-bottom","ui-tabs-tab":"ui-corner-top"},collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var t=/#.*$/;return function(e){var i,s;i=e.href.replace(t,""),s=location.href.replace(t,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return e.hash.length>1&&i===s}}(),_create:function(){var e=this,i=this.options;this.running=!1,this._addClass("ui-tabs","ui-widget ui-widget-content"),this._toggleClass("ui-tabs-collapsible",null,i.collapsible),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var e=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===e&&(s&&this.tabs.each(function(i,n){return t(n).attr("aria-controls")===s?(e=i,!1):void 0}),null===e&&(e=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===e||-1===e)&&(e=this.tabs.length?0:!1)),e!==!1&&(e=this.tabs.index(this.tabs.eq(e)),-1===e&&(e=i?!1:0)),!i&&e===!1&&this.anchors.length&&(e=0),e},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(e){var i=t(t.ui.safeActiveElement(this.document[0])).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(e)){switch(e.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:s++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:n=!1,s--;break;case t.ui.keyCode.END:s=this.anchors.length-1;break;case t.ui.keyCode.HOME:s=0;break;case t.ui.keyCode.SPACE:return e.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case t.ui.keyCode.ENTER:return e.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}e.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),e.ctrlKey||e.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.trigger("focus"))},_handlePageNav:function(e){return e.altKey&&e.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):e.altKey&&e.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).trigger("focus"),t},_setOption:function(t,e){return"active"===t?(this._activate(e),void 0):(this._super(t,e),"collapsible"===t&&(this._toggleClass("ui-tabs-collapsible",null,e),e||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(e),"heightStyle"===t&&this._setupHeightStyle(e),void 0)},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setOptionDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._addClass(this.active,"ui-tabs-active","ui-state-active"),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this,i=this.tabs,s=this.anchors,n=this.panels;this.tablist=this._getList().attr("role","tablist"),this._addClass(this.tablist,"ui-tabs-nav","ui-helper-reset ui-helper-clearfix ui-widget-header"),this.tablist.on("mousedown"+this.eventNamespace,"> li",function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).on("focus"+this.eventNamespace,".ui-tabs-anchor",function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").attr({role:"tab",tabIndex:-1}),this._addClass(this.tabs,"ui-tabs-tab","ui-state-default"),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).attr({role:"presentation",tabIndex:-1}),this._addClass(this.anchors,"ui-tabs-anchor"),this.panels=t(),this.anchors.each(function(i,s){var n,o,a,r=t(s).uniqueId().attr("id"),l=t(s).closest("li"),h=l.attr("aria-controls");e._isLocal(s)?(n=s.hash,a=n.substring(1),o=e.element.find(e._sanitizeSelector(n))):(a=l.attr("aria-controls")||t({}).uniqueId()[0].id,n="#"+a,o=e.element.find(n),o.length||(o=e._createPanel(a),o.insertAfter(e.panels[i-1]||e.tablist)),o.attr("aria-live","polite")),o.length&&(e.panels=e.panels.add(o)),h&&l.data("ui-tabs-aria-controls",h),l.attr({"aria-controls":a,"aria-labelledby":r}),o.attr("aria-labelledby",r)}),this.panels.attr("role","tabpanel"),this._addClass(this.panels,"ui-tabs-panel","ui-widget-content"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol, ul").eq(0)},_createPanel:function(e){return t("
").attr("id",e).data("ui-tabs-destroy",!0)},_setOptionDisabled:function(e){var i,s,n;for(t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1),n=0;s=this.tabs[n];n++)i=t(s),e===!0||-1!==t.inArray(n,e)?(i.attr("aria-disabled","true"),this._addClass(i,null,"ui-state-disabled")):(i.removeAttr("aria-disabled"),this._removeClass(i,null,"ui-state-disabled"));this.options.disabled=e,this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,e===!0)},_setupEvents:function(e){var i={};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(t){t.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,l=r?t():this._getPanelForTab(o),h=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:h,newTab:r?t():o,newPanel:l};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),h.length||l.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),l.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){o._addClass(i.newTab.closest("li"),"ui-tabs-active","ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){o._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),n()}):(this._removeClass(i.oldTab.closest("li"),"ui-tabs-active","ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+t.ui.escapeSelector(e)+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.tablist.removeAttr("role").off(this.eventNamespace),this.anchors.removeAttr("role tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeAttr("role tabIndex aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(e){var i=this.options.disabled;i!==!1&&(void 0===e?i=!1:(e=this._getIndex(e),i=t.isArray(i)?t.map(i,function(t){return t!==e?t:null}):t.map(this.tabs,function(t,i){return i!==e?i:null})),this._setOptionDisabled(i))},disable:function(e){var i=this.options.disabled;if(i!==!0){if(void 0===e)i=!0;else{if(e=this._getIndex(e),-1!==t.inArray(e,i))return;i=t.isArray(i)?t.merge([e],i).sort():[e]}this._setOptionDisabled(i)}},load:function(e,i){e=this._getIndex(e);var s=this,n=this.tabs.eq(e),o=n.find(".ui-tabs-anchor"),a=this._getPanelForTab(n),r={tab:n,panel:a},l=function(t,e){"abort"===e&&s.panels.stop(!1,!0),s._removeClass(n,"ui-tabs-loading"),a.removeAttr("aria-busy"),t===s.xhr&&delete s.xhr};this._isLocal(o[0])||(this.xhr=t.ajax(this._ajaxSettings(o,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(this._addClass(n,"ui-tabs-loading"),a.attr("aria-busy","true"),this.xhr.done(function(t,e,n){setTimeout(function(){a.html(t),s._trigger("load",i,r),l(n,e)},1)}).fail(function(t,e){setTimeout(function(){l(t,e)},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href").replace(/#.*$/,""),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),t.uiBackCompat!==!1&&t.widget("ui.tabs",t.ui.tabs,{_processTabs:function(){this._superApply(arguments),this._addClass(this.tabs,"ui-tab")}}),t.ui.tabs;var s="ui-effects-",n="ui-effects-style",o="ui-effects-animated",a=t;t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=h(),n=s._rgba=[];return i=i.toLowerCase(),f(l,function(t,o){var a,r=o.re.exec(i),l=r&&o.parse(r),h=o.space||"rgba";return l?(a=s[h](l),s[c[h].cache]=a[c[h].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,l=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],h=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=h.support={},p=t("

")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),h.fn=t.extend(h.prototype,{parse:function(n,a,r,l){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,l],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof h?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=h(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=h(t),n=s._space(),o=c[n],a=0===this.alpha()?h("transparent"):this,r=a[o.cache]||o.to(a._rgba),l=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],h=s[o],c=u[n.type]||{};null!==h&&(null===a?l[o]=h:(c.mod&&(h-a>c.mod/2?a+=c.mod:a-h>c.mod/2&&(a-=c.mod)),l[o]=i((h-a)*e+a,n)))}),this[n](l)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=h(e)._rgba;return h(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),h.fn.parse.prototype=h.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),l=Math.min(s,n,o),h=r-l,c=r+l,u=.5*c;return e=l===r?0:s===r?60*(n-o)/h+360:n===r?60*(o-s)/h+120:60*(s-n)/h+240,i=0===h?0:.5>=u?h/c:h/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,l=n.to,c=n.from;h.fn[s]=function(s){if(l&&!this[a]&&(this[a]=l(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=h(c(d)),n[a]=d,n):h(d)},f(o,function(e,i){h.fn[e]||(h.fn[e]=function(n){var o,a=t.type(n),l="alpha"===e?this._hsla?"hsla":"rgba":s,h=this[l](),c=h[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),h[i.idx]=n,this[l](h)))})})}),h.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=h(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(l){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(l){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=h(e.elem,i),e.end=h(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},h.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(a),function(){function e(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function i(e,i){var s,o,a={};for(s in i)o=i[s],e[s]!==o&&(n[s]||(t.fx.step[s]||!isNaN(parseFloat(o)))&&(a[s]=o));return a}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(a.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(n,o,a,r){var l=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",h=l.children?a.find("*").addBack():a;h=h.map(function(){var i=t(this);return{el:i,start:e(this)}}),o=function(){t.each(s,function(t,e){n[e]&&a[e+"Class"](n[e])})},o(),h=h.map(function(){return this.end=e(this.el[0]),this.diff=i(this.start,this.end),this}),a.attr("class",r),h=h.map(function(){var e=this,i=t.Deferred(),s=t.extend({},l,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,h.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),l.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(e){return function(i,s,n,o,a){return"boolean"==typeof s||void 0===s?n?t.effects.animateClass.call(this,s?{add:i}:{remove:i},n,o,a):e.apply(this,arguments):t.effects.animateClass.call(this,{toggle:i},s,n,o)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function e(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function i(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}function a(t,e){var i=e.outerWidth(),s=e.outerHeight(),n=/^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,o=n.exec(t)||["",0,i,s,0];return{top:parseFloat(o[1])||0,right:"auto"===o[2]?i:parseFloat(o[2]),bottom:"auto"===o[3]?s:parseFloat(o[3]),left:parseFloat(o[4])||0}}t.expr&&t.expr.filters&&t.expr.filters.animated&&(t.expr.filters.animated=function(e){return function(i){return!!t(i).data(o)||e(i)}}(t.expr.filters.animated)),t.uiBackCompat!==!1&&t.extend(t.effects,{save:function(t,e){for(var i=0,n=e.length;n>i;i++)null!==e[i]&&t.data(s+e[i],t[0].style[e[i]])},restore:function(t,e){for(var i,n=0,o=e.length;o>n;n++)null!==e[n]&&(i=t.data(s+e[n]),t.css(e[n],i))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("

").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).trigger("focus"),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).trigger("focus")),e}}),t.extend(t.effects,{version:"1.12.1",define:function(e,i,s){return s||(s=i,i="effect"),t.effects.effect[e]=s,t.effects.effect[e].mode=i,s},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,n="vertical"!==i?(e||100)/100:1;return{height:t.height()*n,width:t.width()*s,outerHeight:t.outerHeight()*n,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();e>1&&s.splice.apply(s,[1,0].concat(s.splice(e,i))),t.dequeue()},saveStyle:function(t){t.data(n,t[0].style.cssText)},restoreStyle:function(t){t[0].style.cssText=t.data(n)||"",t.removeData(n)},mode:function(t,e){var i=t.is(":hidden");return"toggle"===e&&(e=i?"show":"hide"),(i?"hide"===e:"show"===e)&&(e="none"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createPlaceholder:function(e){var i,n=e.css("position"),o=e.position();return e.css({marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()),/^(static|relative)/.test(n)&&(n="absolute",i=t("<"+e[0].nodeName+">").insertAfter(e).css({display:/^(inline|ruby)/.test(e.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:e.css("marginTop"),marginBottom:e.css("marginBottom"),marginLeft:e.css("marginLeft"),marginRight:e.css("marginRight"),"float":e.css("float")}).outerWidth(e.outerWidth()).outerHeight(e.outerHeight()).addClass("ui-effects-placeholder"),e.data(s+"placeholder",i)),e.css({position:n,left:o.left,top:o.top}),i},removePlaceholder:function(t){var e=s+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(e){t.effects.restoreStyle(e),t.effects.removePlaceholder(e)},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function i(e){function i(){l.removeData(o),t.effects.cleanUp(l),"hide"===s.mode&&l.hide(),r()}function r(){t.isFunction(h)&&h.call(l[0]),t.isFunction(e)&&e()}var l=t(this);s.mode=u.shift(),t.uiBackCompat===!1||a?"none"===s.mode?(l[c](),r()):n.call(l[0],s,i):(l.is(":hidden")?"hide"===c:"show"===c)?(l[c](),r()):n.call(l[0],s,r)}var s=e.apply(this,arguments),n=t.effects.effect[s.effect],a=n.mode,r=s.queue,l=r||"fx",h=s.complete,c=s.mode,u=[],d=function(e){var i=t(this),s=t.effects.mode(i,c)||a;i.data(o,!0),u.push(s),a&&("show"===s||s===a&&"hide"===s)&&i.show(),a&&"none"===s||t.effects.saveStyle(i),t.isFunction(e)&&e()};return t.fx.off||!n?c?this[c](s.duration,h):this.each(function(){h&&h.call(this)}):r===!1?this.each(d).each(i):this.queue(l,d).queue(l,i)},show:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(t.fn.show),hide:function(t){return function(s){if(i(s))return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(t.fn.hide),toggle:function(t){return function(s){if(i(s)||"boolean"==typeof s)return t.apply(this,arguments);var n=e.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s},cssClip:function(t){return t?this.css("clip","rect("+t.top+"px "+t.right+"px "+t.bottom+"px "+t.left+"px)"):a(this.css("clip"),this)},transfer:function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,l=o?a.scrollLeft():0,h=n.offset(),c={top:h.top-r,left:h.left-l,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("
").appendTo("body").addClass(e.className).css({top:u.top-r,left:u.left-l,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),t.isFunction(i)&&i()})}}),t.fx.step.clip=function(e){e.clipInit||(e.start=t(e.elem).cssClip(),"string"==typeof e.end&&(e.end=a(e.end,e.elem)),e.clipInit=!0),t(e.elem).cssClip({top:e.pos*(e.end.top-e.start.top)+e.start.top,right:e.pos*(e.end.right-e.start.right)+e.start.right,bottom:e.pos*(e.end.bottom-e.start.bottom)+e.start.bottom,left:e.pos*(e.end.left-e.start.left)+e.start.left})}}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}(),t.effects,t.effects.define("fade","toggle",function(e,i){var s="show"===e.mode;t(this).css("opacity",s?0:1).animate({opacity:s?1:0},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}),t.effects.define("slide","show",function(e,i){var s,n,o=t(this),a={up:["bottom","top"],down:["top","bottom"],left:["right","left"],right:["left","right"]},r=e.mode,l=e.direction||"left",h="up"===l||"down"===l?"top":"left",c="up"===l||"left"===l,u=e.distance||o["top"===h?"outerHeight":"outerWidth"](!0),d={};t.effects.createPlaceholder(o),s=o.cssClip(),n=o.position()[h],d[h]=(c?-1:1)*u+n,d.clip=o.cssClip(),d.clip[a[l][1]]=d.clip[a[l][0]],"show"===r&&(o.cssClip(d.clip),o.css(h,d[h]),d.clip=s,d[h]=n),o.animate(d,{queue:!1,duration:e.duration,easing:e.easing,complete:i})})}); + +window.SEMICOLON_tabsInit = function( $tabsEl ){ + + $tabsEl = $tabsEl.filter(':not(.customjs)'); + + if( $tabsEl.length < 1 ){ + return true; + } + + $tabsEl.each( function(){ + let element = $(this), + elAction = element.attr('data-action') || 'click', + elSpeed = element.attr('data-speed') || 400, + elActive = element.attr('data-active') || 1; + + elActive = elActive - 1; + + let windowHash = window.location.hash; + if( $(windowHash).length > 0 && element.find(windowHash).length > 0 ) { + elActive = $( windowHash ).index(); + } + + element.tabs({ + event: elAction, + active: Number(elActive), + show: { + effect: 'fade', + duration: Number(elSpeed) + }, + activate: function( event, ui ) { + $(ui.newPanel).find( '.flexslider .slide' ).resize(); + } + }); + + SEMICOLON_tabsResponsive( element ); + SEMICOLON_tabsResponsiveResizeInit( element ); + + $(window).on( 'scwWindowResize', function() { + SEMICOLON_tabsResponsiveResizeInit( element ); + }); + }); + +}; + +window.SEMICOLON_tabsResponsive = function( $tabsEl ){ + + $tabsEl = $tabsEl.filter('.tabs-responsive'); + + if( $tabsEl.length < 1 ){ + return true; + } + + $tabsEl.each( function(){ + let element = $(this), + elementNav = element.find('.tab-nav'), + elementContent = element.find('.tab-container'); + + elementNav.children('li').each( function(){ + let navEl = $(this), + navElAnchor = navEl.children('a'), + navElTarget = navElAnchor.attr('href'), + navElContent = navElAnchor.html(); + + elementContent.find(navElTarget).before('
'+navElContent+'
'); + }); + }); +}; + +window.SEMICOLON_tabsResponsiveResizeInit = function( $tabsEl ){ + + let $body = $('body'); + $tabsEl = $tabsEl.filter('.tabs-responsive'); + + if( $tabsEl.length < 1 ){ + return true; + } + + $tabsEl.each( function(){ + let element = $(this), + elActive = element.tabs( 'option', 'active' ) + 1, + elementAccStyle = element.attr('data-accordion-style'); + + if( $body.hasClass('device-sm') || $body.hasClass('device-xs') ) { + + element.find('.tab-nav').addClass('d-none'); + element.find('.tab-container').addClass( 'accordion '+ elementAccStyle ).attr('data-active', elActive); + element.find('.tab-content').addClass('accordion-content'); + element.find('.accordion-header').removeClass('d-none'); + SEMICOLON.widget.accordions({ 'parent': element }); + + } else if( $body.hasClass('device-md') || $body.hasClass('device-lg') || $body.hasClass('device-xl') ) { + + element.find('.tab-nav').removeClass('d-none'); + element.find('.tab-container').removeClass( 'accordion '+ elementAccStyle ).attr('data-active', ''); + elActive = element.find('.acctitlec').next('.tab-content').index(); + element.find('.tab-content').removeClass('accordion-content'); + element.find('.accordion-header').addClass('d-none'); + element.tabs('refresh'); + if( elActive > 0 ) { + element.tabs( 'option', 'active', ( ( elActive - 1 ) / 2 ) ); + } + + } + }); +}; + + + +/*! Morphext - v2.4.7 - 2016-11-04 */ +!function(a){"use strict";function b(b,c){this.element=a(b),this.settings=a.extend({},d,c),this._defaults=d,this._init()}var c="Morphext",d={animation:"bounceIn",separator:",",speed:2e3,complete:a.noop};b.prototype={_init:function(){var b=this;this.phrases=[],this.element.addClass("morphext"),a.each(this.element.text().split(this.settings.separator),function(c,d){b.phrases.push(a.trim(d))}),this.index=-1,this.animate(),this.start()},animate:function(){this.index=++this.index%this.phrases.length,this.element[0].innerHTML=''+this.phrases[this.index]+"",a.isFunction(this.settings.complete)&&this.settings.complete.call(this)},start:function(){var a=this;this._interval=setInterval(function(){a.animate()},this.settings.speed)},stop:function(){this._interval=clearInterval(this._interval)}},a.fn[c]=function(d){return this.each(function(){a.data(this,"plugin_"+c)||a.data(this,"plugin_"+c,new b(this,d))})}}(jQuery); + +/*! + * + * typed.js - A JavaScript Typing Animation Library + * Author: Matt Boldt + * Version: v2.0.11 + * Url: https://github.com/mattboldt/typed.js + * License(s): MIT + * + */ +(function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Typed=e():t.Typed=e()})(this,function(){return function(t){function e(n){if(s[n])return s[n].exports;var i=s[n]={exports:{},id:n,loaded:!1};return t[n].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var s={};return e.m=t,e.c=s,e.p="",e(0)}([function(t,e,s){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function t(t,e){for(var s=0;st.length)););var u=t.substring(0,e),l=t.substring(u.length+1,e+i),c=t.substring(e+i+1);t=u+l+c,i--}s.timeout=setTimeout(function(){s.toggleBlinking(!1),e>=t.length?s.doneTyping(t,e):s.keepTyping(t,e,i),s.temporaryPause&&(s.temporaryPause=!1,s.options.onTypingResumed(s.arrayPos,s))},n)},n))}},{key:"keepTyping",value:function(t,e,s){0===e&&(this.toggleBlinking(!1),this.options.preStringTyped(this.arrayPos,this)),e+=s;var n=t.substr(0,e);this.replaceText(n),this.typewrite(t,e)}},{key:"doneTyping",value:function(t,e){var s=this;this.options.onStringTyped(this.arrayPos,this),this.toggleBlinking(!0),this.arrayPos===this.strings.length-1&&(this.complete(),this.loop===!1||this.curLoop===this.loopCount)||(this.timeout=setTimeout(function(){s.backspace(t,e)},this.backDelay))}},{key:"backspace",value:function(t,e){var s=this;if(this.pause.status===!0)return void this.setPauseStatus(t,e,!0);if(this.fadeOut)return this.initFadeOut();this.toggleBlinking(!1);var n=this.humanizer(this.backSpeed);this.timeout=setTimeout(function(){e=o.htmlParser.backSpaceHtmlChars(t,e,s);var n=t.substr(0,e);if(s.replaceText(n),s.smartBackspace){var i=s.strings[s.arrayPos+1];i&&n===i.substr(0,e)?s.stopNum=e:s.stopNum=0}e>s.stopNum?(e--,s.backspace(t,e)):e<=s.stopNum&&(s.arrayPos++,s.arrayPos===s.strings.length?(s.arrayPos=0,s.options.onLastStringBackspaced(),s.shuffleStringsIfNeeded(),s.begin()):s.typewrite(s.strings[s.sequence[s.arrayPos]],e))},n)}},{key:"complete",value:function(){this.options.onComplete(this),this.loop?this.curLoop++:this.typingComplete=!0}},{key:"setPauseStatus",value:function(t,e,s){this.pause.typewrite=s,this.pause.curString=t,this.pause.curStrPos=e}},{key:"toggleBlinking",value:function(t){this.cursor&&(this.pause.status||this.cursorBlinking!==t&&(this.cursorBlinking=t,t?this.cursor.classList.add("typed-cursor--blink"):this.cursor.classList.remove("typed-cursor--blink")))}},{key:"humanizer",value:function(t){return Math.round(Math.random()*t/2)+t}},{key:"shuffleStringsIfNeeded",value:function(){this.shuffle&&(this.sequence=this.sequence.sort(function(){return Math.random()-.5}))}},{key:"initFadeOut",value:function(){var t=this;return this.el.className+=" "+this.fadeOutClass,this.cursor&&(this.cursor.className+=" "+this.fadeOutClass),setTimeout(function(){t.arrayPos++,t.replaceText(""),t.strings.length>t.arrayPos?t.typewrite(t.strings[t.sequence[t.arrayPos]],0):(t.typewrite(t.strings[0],0),t.arrayPos=0)},this.fadeOutDelay)}},{key:"replaceText",value:function(t){this.attr?this.el.setAttribute(this.attr,t):this.isInput?this.el.value=t:"html"===this.contentType?this.el.innerHTML=t:this.el.textContent=t}},{key:"bindFocusEvents",value:function(){var t=this;this.isInput&&(this.el.addEventListener("focus",function(e){t.stop()}),this.el.addEventListener("blur",function(e){t.el.value&&0!==t.el.value.length||t.start()}))}},{key:"insertCursor",value:function(){this.showCursor&&(this.cursor||(this.cursor=document.createElement("span"),this.cursor.className="typed-cursor",this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)))}}]),t}();e["default"]=a,t.exports=e["default"]},function(t,e,s){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=Object.assign||function(t){for(var e=1;e":";";t.substr(e+1).charAt(0)!==i&&(e++,!(e+1>t.length)););e++}return e}},{key:"backSpaceHtmlChars",value:function(t,e,s){if("html"!==s.contentType)return e;var n=t.substr(e).charAt(0);if(">"===n||";"===n){var i="";for(i=">"===n?"<":"&";t.substr(e-1).charAt(0)!==i&&(e--,!(e<0)););e--}return e}}]),t}();e["default"]=i;var r=new i;e.htmlParser=r}])}); + +window.SEMICOLON_textRotatorInit = function( $textRotatorEl ){ + + $textRotatorEl = $textRotatorEl.filter(':not(.customjs)'); + + if( $textRotatorEl.length < 1 ){ + return true; + } + + $textRotatorEl.each(function(){ + let element = $(this), + elTyped = element.attr('data-typed') || 'false', + elRotator = element.find('.t-rotate'), + elAnimation = element.attr('data-rotate') || 'fade', + elSpeed = element.attr('data-speed') || 1200, + elSep = element.attr('data-separator') || ','; + + if( elTyped == 'true' ) { + let elTexts = elRotator.html().split( elSep ), + elLoop = element.attr('data-loop') || 'true', + elShuffle = element.attr('data-shuffle'), + elCur = element.attr('data-cursor') || 'true', + elSpeed = element.attr('data-speed') || 50, + elBackSpeed = element.attr('data-backspeed') || 30, + elBackDelay = element.attr('data-backdelay'); + + if( elLoop == 'true' ) { elLoop = true; } else { elLoop = false; } + if( elShuffle == 'true' ) { elShuffle = true; } else { elShuffle = false; } + if( elCur == 'true' ) { elCur = true; } else { elCur = false; } + + elRotator.html( '' ).addClass('plugin-typed-init'); + + let typed = new Typed( elRotator.get(0) , { + strings: elTexts, + typeSpeed: Number( elSpeed ), + loop: elLoop, + shuffle: elShuffle, + showCursor: elCur, + backSpeed: Number( elBackSpeed ), + backDelay: Number( elBackDelay ) + }); + } else { + let pluginData = elRotator.Morphext({ + animation: elAnimation, + separator: elSep, + speed: Number(elSpeed) + }); + } + }); + +}; + + + +window.scwTogglesPlugin = window.scwTogglesPlugin || {}; + +window.SEMICOLON_togglesInit = function( $toggleEl ){ + + $toggleEl = $toggleEl.filter(':not(.customjs)'); + + if( $toggleEl.length < 1 ){ + return true; + } + + $toggleEl.each( function(){ + let element = $(this), + elSpeed = element.attr('data-speed') || 300, + elState = element.attr('data-state'); + + if( elState != 'open' ){ + element.children('.toggle-content').hide(); + } else { + element.addClass('toggle-active').children('.toggle-content').slideDown( Number(elSpeed) ); + } + + element.children('.toggle-header').off( 'click' ).on( 'click', function(){ + element.toggleClass('toggle-active').children('.toggle-content').slideToggle( Number(elSpeed) ); + return true; + }); + }); + +}; + + + +/** + * Twitter Feed Fetcher + */ + +function sm_format_twitter(twitters) { + var statusHTML = []; + for (var i=0; i]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) { + return ''+url+''; + }).replace(/\B@([_a-z0-9]+)/ig, function(reply) { + return reply.charAt(0)+''+reply.substring(1)+''; + }); + statusHTML.push('
  • '); + } + return statusHTML.join(''); +} + +function sm_format_twitter2(twitters) { + var statusHTML = []; + for (var i=0; i]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) { + return ''+url+''; + }).replace(/\B@([_a-z0-9]+)/ig, function(reply) { + return reply.charAt(0)+''+reply.substring(1)+''; + }); + statusHTML.push(''); + } + return statusHTML.join(''); +} + +function sm_format_twitter3(twitters) { + var statusHTML = []; + for (var i=0; i]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) { + return ''+url+''; + }).replace(/\B@([_a-z0-9]+)/ig, function(reply) { + return reply.charAt(0)+''+reply.substring(1)+''; + }); + statusHTML.push(''); + } + return statusHTML.join(''); +} + +function relative_time(time_value) { + var values = time_value.split(" "); + time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3]; + var parsed_date = Date.parse(time_value); + var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); + var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); + delta = delta + (relative_to.getTimezoneOffset() * 60); + + if (delta < 60) { + return 'less than a minute ago'; + } else if(delta < 120) { + return 'about a minute ago'; + } else if(delta < (60*60)) { + return (parseInt(delta / 60)).toString() + ' minutes ago'; + } else if(delta < (120*60)) { + return 'about an hour ago'; + } else if(delta < (24*60*60)) { + return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago'; + } else if(delta < (48*60*60)) { + return '1 day ago'; + } else { + return (parseInt(delta / 86400)).toString() + ' days ago'; + } +} + +window.SEMICOLON_twitterFeedInit = function( $twitterFeedEl ){ + + if( $twitterFeedEl.length < 1 ){ + return true; + } + + $twitterFeedEl.each(function() { + let element = $(this), + elUser = element.attr('data-username') || 'twitter', + elCount = element.attr('data-count') || 3, + elLoader = element.attr('data-loader') || 'include/twitter/tweets.php'; + + $.getJSON( elLoader + '?username='+ elUser +'&count='+ Number( elCount ), function(tweets){ + if( element.hasClass('fslider') ) { + element.find(".slider-wrap").html(sm_format_twitter3(tweets)).promise().done( function(){ + let timer = setInterval(function(){ + if( element.find('.slide').length > 1 ) { + element.removeClass('customjs'); + setTimeout( function(){ SEMICOLON.widget.loadFlexSlider(); }, 500); + clearInterval(timer); + } + }, 500); + }); + } else { + element.html(sm_format_twitter(tweets)); + } + }); + }); + +}; + + + +/*jquery.mb.YTPlayer 23-01-2021 + _ jquery.mb.components + _ email: matbicoc@gmail.com + _ Copyright (c) 2001-2021. Matteo Bicocchi (Pupunzi); + _ blog: http://pupunzi.open-lab.com + _ Open Lab s.r.l., Florence - Italy + */ + +var ytp=ytp||{};let YTPRndSuffix=(new Date).getTime(),YTPTimerLabels={init:"YTPlayerInit_"+YTPRndSuffix,startPlaying:"YTPlayerStartPlay_"+YTPRndSuffix};function onYouTubeIframeAPIReady(){ytp.YTAPIReady||(ytp.YTAPIReady=!0,jQuery(document).trigger("YTAPIReady"))}let getYTPVideoID=function(e){let r,t;return e.indexOf("youtu.be")>0||e.indexOf("youtube.com/embed")>0?r=(t=(r=e.substr(e.lastIndexOf("/")+1,e.length)).indexOf("?list=")>0?r.substr(r.lastIndexOf("="),r.length):null)?r.substr(0,r.lastIndexOf("?")):r:e.indexOf("http")>-1?(r=e.match(/[\\?&]v=([^&#]*)/)[1],t=e.indexOf("list=")>0?e.match(/[\\?&]list=([^&#]*)/)[1]:null):t=(r=e.length>15?null:e)?null:e,{videoID:r,playlistID:t}};!function(jQuery,ytp){jQuery.mbYTPlayer={name:"jquery.mb.YTPlayer",version:"3.3.9",build:"7581",author:"Matteo Bicocchi (pupunzi)",apiKey:"",defaults:{videoURL:null,containment:"body",ratio:"auto",fadeOnStartTime:1e3,startAt:0,stopAt:0,autoPlay:!0,delayAtStart:1e3,coverImage:!1,loop:!0,addRaster:!1,mask:!1,opacity:1,quality:"hd1080",vol:50,mute:!1,showControls:!0,anchor:"center,center",showAnnotations:!1,cc_load_policy:!1,showYTLogo:!0,useOnMobile:!0,playOnlyIfVisible:!1,onScreenPercentage:30,goFullScreenOnPlay:!1,stopMovieOnBlur:!0,realFullscreen:!0,optimizeDisplay:!0,abundance:.3,gaTrack:!0,remember_last_time:!1,addFilters:!1,useNoCookie:!0,onReady:function(e){},onError:function(e,r){},onEnd:function(){}},controls:{play:"P",pause:"p",mute:"M",unmute:"A",onlyYT:"O",showSite:"R",ytLogo:"Y"},controlBar:null,locationProtocol:"https:",defaultFilters:{grayscale:{value:0,unit:"%"},hue_rotate:{value:0,unit:"deg"},invert:{value:0,unit:"%"},opacity:{value:0,unit:"%"},saturate:{value:0,unit:"%"},sepia:{value:0,unit:"%"},brightness:{value:0,unit:"%"},contrast:{value:0,unit:"%"},blur:{value:0,unit:"px"}},buildPlayer:function(options){if(ytp.YTAPIReady||void 0!==window.YT)setTimeout(function(){jQuery(document).trigger("YTAPIReady"),ytp.YTAPIReady=!0},100);else{jQuery("#YTAPI").remove();let e=jQuery(" + * + * + * + * + * + * @param {!string} ns The namespace of the class definition, leaving off "com.greensock." as that's assumed. For example, "TweenLite" or "plugins.CSSPlugin" or "easing.Back". + * @param {!Array.} dependencies An array of dependencies (described as their namespaces minus "com.greensock." prefix). For example ["TweenLite","plugins.TweenPlugin","core.Animation"] + * @param {!function():Object} func The function that should be called and passed the resolved dependencies which will return the actual class for this definition. + * @param {boolean=} global If true, the class will be added to the global scope (typically window unless you define a window.GreenSockGlobals object) + */ + Definition = function(ns, dependencies, func, global) { + this.sc = (_defLookup[ns]) ? _defLookup[ns].sc : []; //subclasses + _defLookup[ns] = this; + this.gsClass = null; + this.func = func; + var _classes = []; + this.check = function(init) { + var i = dependencies.length, + missing = i, + cur, a, n, cl, hasModule; + while (--i > -1) { + if ((cur = _defLookup[dependencies[i]] || new Definition(dependencies[i], [])).gsClass) { + _classes[i] = cur.gsClass; + missing--; + } else if (init) { + cur.sc.push(this); + } + } + if (missing === 0 && func) { + a = ("com.greensock." + ns).split("."); + n = a.pop(); + cl = _namespace(a.join("."))[n] = this.gsClass = func.apply(func, _classes); + + //exports to multiple environments + if (global) { + _globals[n] = _exports[n] = cl; //provides a way to avoid global namespace pollution. By default, the main classes like TweenLite, Power1, Strong, etc. are added to window unless a GreenSockGlobals is defined. So if you want to have things added to a custom object instead, just do something like window.GreenSockGlobals = {} before loading any GreenSock files. You can even set up an alias like window.GreenSockGlobals = windows.gs = {} so that you can access everything like gs.TweenLite. Also remember that ALL classes are added to the window.com.greensock object (in their respective packages, like com.greensock.easing.Power1, com.greensock.TweenLite, etc.) + hasModule = (typeof(module) !== "undefined" && module.exports); + if (!hasModule && typeof(define) === "function" && define.amd){ //AMD + define((window.GreenSockAMDPath ? window.GreenSockAMDPath + "/" : "") + ns.split(".").pop(), [], function() { return cl; }); + } else if (hasModule){ //node + if (ns === moduleName) { + module.exports = _exports[moduleName] = cl; + for (i in _exports) { + cl[i] = _exports[i]; + } + } else if (_exports[moduleName]) { + _exports[moduleName][n] = cl; + } + } + } + for (i = 0; i < this.sc.length; i++) { + this.sc[i].check(); + } + } + }; + this.check(true); + }, + + //used to create Definition instances (which basically registers a class that has dependencies). + _gsDefine = window._gsDefine = function(ns, dependencies, func, global) { + return new Definition(ns, dependencies, func, global); + }, + + //a quick way to create a class that doesn't have any dependencies. Returns the class, but first registers it in the GreenSock namespace so that other classes can grab it (other classes might be dependent on the class). + _class = gs._class = function(ns, func, global) { + func = func || function() {}; + _gsDefine(ns, [], function(){ return func; }, global); + return func; + }; + + _gsDefine.globals = _globals; + + + +/* + * ---------------------------------------------------------------- + * Ease + * ---------------------------------------------------------------- + */ + var _baseParams = [0, 0, 1, 1], + _blankArray = [], + Ease = _class("easing.Ease", function(func, extraParams, type, power) { + this._func = func; + this._type = type || 0; + this._power = power || 0; + this._params = extraParams ? _baseParams.concat(extraParams) : _baseParams; + }, true), + _easeMap = Ease.map = {}, + _easeReg = Ease.register = function(ease, names, types, create) { + var na = names.split(","), + i = na.length, + ta = (types || "easeIn,easeOut,easeInOut").split(","), + e, name, j, type; + while (--i > -1) { + name = na[i]; + e = create ? _class("easing."+name, null, true) : gs.easing[name] || {}; + j = ta.length; + while (--j > -1) { + type = ta[j]; + _easeMap[name + "." + type] = _easeMap[type + name] = e[type] = ease.getRatio ? ease : ease[type] || new ease(); + } + } + }; + + p = Ease.prototype; + p._calcEnd = false; + p.getRatio = function(p) { + if (this._func) { + this._params[0] = p; + return this._func.apply(null, this._params); + } + var t = this._type, + pw = this._power, + r = (t === 1) ? 1 - p : (t === 2) ? p : (p < 0.5) ? p * 2 : (1 - p) * 2; + if (pw === 1) { + r *= r; + } else if (pw === 2) { + r *= r * r; + } else if (pw === 3) { + r *= r * r * r; + } else if (pw === 4) { + r *= r * r * r * r; + } + return (t === 1) ? 1 - r : (t === 2) ? r : (p < 0.5) ? r / 2 : 1 - (r / 2); + }; + + //create all the standard eases like Linear, Quad, Cubic, Quart, Quint, Strong, Power0, Power1, Power2, Power3, and Power4 (each with easeIn, easeOut, and easeInOut) + a = ["Linear","Quad","Cubic","Quart","Quint,Strong"]; + i = a.length; + while (--i > -1) { + p = a[i]+",Power"+i; + _easeReg(new Ease(null,null,1,i), p, "easeOut", true); + _easeReg(new Ease(null,null,2,i), p, "easeIn" + ((i === 0) ? ",easeNone" : "")); + _easeReg(new Ease(null,null,3,i), p, "easeInOut"); + } + _easeMap.linear = gs.easing.Linear.easeIn; + _easeMap.swing = gs.easing.Quad.easeInOut; //for jQuery folks + + +/* + * ---------------------------------------------------------------- + * EventDispatcher + * ---------------------------------------------------------------- + */ + var EventDispatcher = _class("events.EventDispatcher", function(target) { + this._listeners = {}; + this._eventTarget = target || this; + }); + p = EventDispatcher.prototype; + + p.addEventListener = function(type, callback, scope, useParam, priority) { + priority = priority || 0; + var list = this._listeners[type], + index = 0, + listener, i; + if (this === _ticker && !_tickerActive) { + _ticker.wake(); + } + if (list == null) { + this._listeners[type] = list = []; + } + i = list.length; + while (--i > -1) { + listener = list[i]; + if (listener.c === callback && listener.s === scope) { + list.splice(i, 1); + } else if (index === 0 && listener.pr < priority) { + index = i + 1; + } + } + list.splice(index, 0, {c:callback, s:scope, up:useParam, pr:priority}); + }; + + p.removeEventListener = function(type, callback) { + var list = this._listeners[type], i; + if (list) { + i = list.length; + while (--i > -1) { + if (list[i].c === callback) { + list.splice(i, 1); + return; + } + } + } + }; + + p.dispatchEvent = function(type) { + var list = this._listeners[type], + i, t, listener; + if (list) { + i = list.length; + if (i > 1) { + list = list.slice(0); //in case addEventListener() is called from within a listener/callback (otherwise the index could change, resulting in a skip) + } + t = this._eventTarget; + while (--i > -1) { + listener = list[i]; + if (listener) { + if (listener.up) { + listener.c.call(listener.s || t, {type:type, target:t}); + } else { + listener.c.call(listener.s || t); + } + } + } + } + }; + + +/* + * ---------------------------------------------------------------- + * Ticker + * ---------------------------------------------------------------- + */ + var _reqAnimFrame = window.requestAnimationFrame, + _cancelAnimFrame = window.cancelAnimationFrame, + _getTime = Date.now || function() {return new Date().getTime();}, + _lastUpdate = _getTime(); + + //now try to determine the requestAnimationFrame and cancelAnimationFrame functions and if none are found, we'll use a setTimeout()/clearTimeout() polyfill. + a = ["ms","moz","webkit","o"]; + i = a.length; + while (--i > -1 && !_reqAnimFrame) { + _reqAnimFrame = window[a[i] + "RequestAnimationFrame"]; + _cancelAnimFrame = window[a[i] + "CancelAnimationFrame"] || window[a[i] + "CancelRequestAnimationFrame"]; + } + + _class("Ticker", function(fps, useRAF) { + var _self = this, + _startTime = _getTime(), + _useRAF = (useRAF !== false && _reqAnimFrame) ? "auto" : false, + _lagThreshold = 500, + _adjustedLag = 33, + _tickWord = "tick", //helps reduce gc burden + _fps, _req, _id, _gap, _nextTime, + _tick = function(manual) { + var elapsed = _getTime() - _lastUpdate, + overlap, dispatch; + if (elapsed > _lagThreshold) { + _startTime += elapsed - _adjustedLag; + } + _lastUpdate += elapsed; + _self.time = (_lastUpdate - _startTime) / 1000; + overlap = _self.time - _nextTime; + if (!_fps || overlap > 0 || manual === true) { + _self.frame++; + _nextTime += overlap + (overlap >= _gap ? 0.004 : _gap - overlap); + dispatch = true; + } + if (manual !== true) { //make sure the request is made before we dispatch the "tick" event so that timing is maintained. Otherwise, if processing the "tick" requires a bunch of time (like 15ms) and we're using a setTimeout() that's based on 16.7ms, it'd technically take 31.7ms between frames otherwise. + _id = _req(_tick); + } + if (dispatch) { + _self.dispatchEvent(_tickWord); + } + }; + + EventDispatcher.call(_self); + _self.time = _self.frame = 0; + _self.tick = function() { + _tick(true); + }; + + _self.lagSmoothing = function(threshold, adjustedLag) { + _lagThreshold = threshold || (1 / _tinyNum); //zero should be interpreted as basically unlimited + _adjustedLag = Math.min(adjustedLag, _lagThreshold, 0); + }; + + _self.sleep = function() { + if (_id == null) { + return; + } + if (!_useRAF || !_cancelAnimFrame) { + clearTimeout(_id); + } else { + _cancelAnimFrame(_id); + } + _req = _emptyFunc; + _id = null; + if (_self === _ticker) { + _tickerActive = false; + } + }; + + _self.wake = function(seamless) { + if (_id !== null) { + _self.sleep(); + } else if (seamless) { + _startTime += -_lastUpdate + (_lastUpdate = _getTime()); + } else if (_self.frame > 10) { //don't trigger lagSmoothing if we're just waking up, and make sure that at least 10 frames have elapsed because of the iOS bug that we work around below with the 1.5-second setTimout(). + _lastUpdate = _getTime() - _lagThreshold + 5; + } + _req = (_fps === 0) ? _emptyFunc : (!_useRAF || !_reqAnimFrame) ? function(f) { return setTimeout(f, ((_nextTime - _self.time) * 1000 + 1) | 0); } : _reqAnimFrame; + if (_self === _ticker) { + _tickerActive = true; + } + _tick(2); + }; + + _self.fps = function(value) { + if (!arguments.length) { + return _fps; + } + _fps = value; + _gap = 1 / (_fps || 60); + _nextTime = this.time + _gap; + _self.wake(); + }; + + _self.useRAF = function(value) { + if (!arguments.length) { + return _useRAF; + } + _self.sleep(); + _useRAF = value; + _self.fps(_fps); + }; + _self.fps(fps); + + //a bug in iOS 6 Safari occasionally prevents the requestAnimationFrame from working initially, so we use a 1.5-second timeout that automatically falls back to setTimeout() if it senses this condition. + setTimeout(function() { + if (_useRAF === "auto" && _self.frame < 5 && document.visibilityState !== "hidden") { + _self.useRAF(false); + } + }, 1500); + }); + + p = gs.Ticker.prototype = new gs.events.EventDispatcher(); + p.constructor = gs.Ticker; + + +/* + * ---------------------------------------------------------------- + * Animation + * ---------------------------------------------------------------- + */ + var Animation = _class("core.Animation", function(duration, vars) { + this.vars = vars = vars || {}; + this._duration = this._totalDuration = duration || 0; + this._delay = Number(vars.delay) || 0; + this._timeScale = 1; + this._active = (vars.immediateRender === true); + this.data = vars.data; + this._reversed = (vars.reversed === true); + + if (!_rootTimeline) { + return; + } + if (!_tickerActive) { //some browsers (like iOS 6 Safari) shut down JavaScript execution when the tab is disabled and they [occasionally] neglect to start up requestAnimationFrame again when returning - this code ensures that the engine starts up again properly. + _ticker.wake(); + } + + var tl = this.vars.useFrames ? _rootFramesTimeline : _rootTimeline; + tl.add(this, tl._time); + + if (this.vars.paused) { + this.paused(true); + } + }); + + _ticker = Animation.ticker = new gs.Ticker(); + p = Animation.prototype; + p._dirty = p._gc = p._initted = p._paused = false; + p._totalTime = p._time = 0; + p._rawPrevTime = -1; + p._next = p._last = p._onUpdate = p._timeline = p.timeline = null; + p._paused = false; + + + //some browsers (like iOS) occasionally drop the requestAnimationFrame event when the user switches to a different tab and then comes back again, so we use a 2-second setTimeout() to sense if/when that condition occurs and then wake() the ticker. + var _checkTimeout = function() { + if (_tickerActive && _getTime() - _lastUpdate > 2000) { + _ticker.wake(); + } + setTimeout(_checkTimeout, 2000); + }; + _checkTimeout(); + + + p.play = function(from, suppressEvents) { + if (from != null) { + this.seek(from, suppressEvents); + } + return this.reversed(false).paused(false); + }; + + p.pause = function(atTime, suppressEvents) { + if (atTime != null) { + this.seek(atTime, suppressEvents); + } + return this.paused(true); + }; + + p.resume = function(from, suppressEvents) { + if (from != null) { + this.seek(from, suppressEvents); + } + return this.paused(false); + }; + + p.seek = function(time, suppressEvents) { + return this.totalTime(Number(time), suppressEvents !== false); + }; + + p.restart = function(includeDelay, suppressEvents) { + return this.reversed(false).paused(false).totalTime(includeDelay ? -this._delay : 0, (suppressEvents !== false), true); + }; + + p.reverse = function(from, suppressEvents) { + if (from != null) { + this.seek((from || this.totalDuration()), suppressEvents); + } + return this.reversed(true).paused(false); + }; + + p.render = function(time, suppressEvents, force) { + //stub - we override this method in subclasses. + }; + + p.invalidate = function() { + this._time = this._totalTime = 0; + this._initted = this._gc = false; + this._rawPrevTime = -1; + if (this._gc || !this.timeline) { + this._enabled(true); + } + return this; + }; + + p.isActive = function() { + var tl = this._timeline, //the 2 root timelines won't have a _timeline; they're always active. + startTime = this._startTime, + rawTime; + return (!tl || (!this._gc && !this._paused && tl.isActive() && (rawTime = tl.rawTime()) >= startTime && rawTime < startTime + this.totalDuration() / this._timeScale)); + }; + + p._enabled = function (enabled, ignoreTimeline) { + if (!_tickerActive) { + _ticker.wake(); + } + this._gc = !enabled; + this._active = this.isActive(); + if (ignoreTimeline !== true) { + if (enabled && !this.timeline) { + this._timeline.add(this, this._startTime - this._delay); + } else if (!enabled && this.timeline) { + this._timeline._remove(this, true); + } + } + return false; + }; + + + p._kill = function(vars, target) { + return this._enabled(false, false); + }; + + p.kill = function(vars, target) { + this._kill(vars, target); + return this; + }; + + p._uncache = function(includeSelf) { + var tween = includeSelf ? this : this.timeline; + while (tween) { + tween._dirty = true; + tween = tween.timeline; + } + return this; + }; + + p._swapSelfInParams = function(params) { + var i = params.length, + copy = params.concat(); + while (--i > -1) { + if (params[i] === "{self}") { + copy[i] = this; + } + } + return copy; + }; + + p._callback = function(type) { + var v = this.vars, + callback = v[type], + params = v[type + "Params"], + scope = v[type + "Scope"] || v.callbackScope || this, + l = params ? params.length : 0; + switch (l) { //speed optimization; call() is faster than apply() so use it when there are only a few parameters (which is by far most common). Previously we simply did var v = this.vars; v[type].apply(v[type + "Scope"] || v.callbackScope || this, v[type + "Params"] || _blankArray); + case 0: callback.call(scope); break; + case 1: callback.call(scope, params[0]); break; + case 2: callback.call(scope, params[0], params[1]); break; + default: callback.apply(scope, params); + } + }; + +//----Animation getters/setters -------------------------------------------------------- + + p.eventCallback = function(type, callback, params, scope) { + if ((type || "").substr(0,2) === "on") { + var v = this.vars; + if (arguments.length === 1) { + return v[type]; + } + if (callback == null) { + delete v[type]; + } else { + v[type] = callback; + v[type + "Params"] = (_isArray(params) && params.join("").indexOf("{self}") !== -1) ? this._swapSelfInParams(params) : params; + v[type + "Scope"] = scope; + } + if (type === "onUpdate") { + this._onUpdate = callback; + } + } + return this; + }; + + p.delay = function(value) { + if (!arguments.length) { + return this._delay; + } + if (this._timeline.smoothChildTiming) { + this.startTime( this._startTime + value - this._delay ); + } + this._delay = value; + return this; + }; + + p.duration = function(value) { + if (!arguments.length) { + this._dirty = false; + return this._duration; + } + this._duration = this._totalDuration = value; + this._uncache(true); //true in case it's a TweenMax or TimelineMax that has a repeat - we'll need to refresh the totalDuration. + if (this._timeline.smoothChildTiming) if (this._time > 0) if (this._time < this._duration) if (value !== 0) { + this.totalTime(this._totalTime * (value / this._duration), true); + } + return this; + }; + + p.totalDuration = function(value) { + this._dirty = false; + return (!arguments.length) ? this._totalDuration : this.duration(value); + }; + + p.time = function(value, suppressEvents) { + if (!arguments.length) { + return this._time; + } + if (this._dirty) { + this.totalDuration(); + } + return this.totalTime((value > this._duration) ? this._duration : value, suppressEvents); + }; + + p.totalTime = function(time, suppressEvents, uncapped) { + if (!_tickerActive) { + _ticker.wake(); + } + if (!arguments.length) { + return this._totalTime; + } + if (this._timeline) { + if (time < 0 && !uncapped) { + time += this.totalDuration(); + } + if (this._timeline.smoothChildTiming) { + if (this._dirty) { + this.totalDuration(); + } + var totalDuration = this._totalDuration, + tl = this._timeline; + if (time > totalDuration && !uncapped) { + time = totalDuration; + } + this._startTime = (this._paused ? this._pauseTime : tl._time) - ((!this._reversed ? time : totalDuration - time) / this._timeScale); + if (!tl._dirty) { //for performance improvement. If the parent's cache is already dirty, it already took care of marking the ancestors as dirty too, so skip the function call here. + this._uncache(false); + } + //in case any of the ancestor timelines had completed but should now be enabled, we should reset their totalTime() which will also ensure that they're lined up properly and enabled. Skip for animations that are on the root (wasteful). Example: a TimelineLite.exportRoot() is performed when there's a paused tween on the root, the export will not complete until that tween is unpaused, but imagine a child gets restarted later, after all [unpaused] tweens have completed. The startTime of that child would get pushed out, but one of the ancestors may have completed. + if (tl._timeline) { + while (tl._timeline) { + if (tl._timeline._time !== (tl._startTime + tl._totalTime) / tl._timeScale) { + tl.totalTime(tl._totalTime, true); + } + tl = tl._timeline; + } + } + } + if (this._gc) { + this._enabled(true, false); + } + if (this._totalTime !== time || this._duration === 0) { + if (_lazyTweens.length) { + _lazyRender(); + } + this.render(time, suppressEvents, false); + if (_lazyTweens.length) { //in case rendering caused any tweens to lazy-init, we should render them because typically when someone calls seek() or time() or progress(), they expect an immediate render. + _lazyRender(); + } + } + } + return this; + }; + + p.progress = p.totalProgress = function(value, suppressEvents) { + var duration = this.duration(); + return (!arguments.length) ? (duration ? this._time / duration : this.ratio) : this.totalTime(duration * value, suppressEvents); + }; + + p.startTime = function(value) { + if (!arguments.length) { + return this._startTime; + } + if (value !== this._startTime) { + this._startTime = value; + if (this.timeline) if (this.timeline._sortChildren) { + this.timeline.add(this, value - this._delay); //ensures that any necessary re-sequencing of Animations in the timeline occurs to make sure the rendering order is correct. + } + } + return this; + }; + + p.endTime = function(includeRepeats) { + return this._startTime + ((includeRepeats != false) ? this.totalDuration() : this.duration()) / this._timeScale; + }; + + p.timeScale = function(value) { + if (!arguments.length) { + return this._timeScale; + } + value = value || _tinyNum; //can't allow zero because it'll throw the math off + if (this._timeline && this._timeline.smoothChildTiming) { + var pauseTime = this._pauseTime, + t = (pauseTime || pauseTime === 0) ? pauseTime : this._timeline.totalTime(); + this._startTime = t - ((t - this._startTime) * this._timeScale / value); + } + this._timeScale = value; + return this._uncache(false); + }; + + p.reversed = function(value) { + if (!arguments.length) { + return this._reversed; + } + if (value != this._reversed) { + this._reversed = value; + this.totalTime(((this._timeline && !this._timeline.smoothChildTiming) ? this.totalDuration() - this._totalTime : this._totalTime), true); + } + return this; + }; + + p.paused = function(value) { + if (!arguments.length) { + return this._paused; + } + var tl = this._timeline, + raw, elapsed; + if (value != this._paused) if (tl) { + if (!_tickerActive && !value) { + _ticker.wake(); + } + raw = tl.rawTime(); + elapsed = raw - this._pauseTime; + if (!value && tl.smoothChildTiming) { + this._startTime += elapsed; + this._uncache(false); + } + this._pauseTime = value ? raw : null; + this._paused = value; + this._active = this.isActive(); + if (!value && elapsed !== 0 && this._initted && this.duration()) { + raw = tl.smoothChildTiming ? this._totalTime : (raw - this._startTime) / this._timeScale; + this.render(raw, (raw === this._totalTime), true); //in case the target's properties changed via some other tween or manual update by the user, we should force a render. + } + } + if (this._gc && !value) { + this._enabled(true, false); + } + return this; + }; + + +/* + * ---------------------------------------------------------------- + * SimpleTimeline + * ---------------------------------------------------------------- + */ + var SimpleTimeline = _class("core.SimpleTimeline", function(vars) { + Animation.call(this, 0, vars); + this.autoRemoveChildren = this.smoothChildTiming = true; + }); + + p = SimpleTimeline.prototype = new Animation(); + p.constructor = SimpleTimeline; + p.kill()._gc = false; + p._first = p._last = p._recent = null; + p._sortChildren = false; + + p.add = p.insert = function(child, position, align, stagger) { + var prevTween, st; + child._startTime = Number(position || 0) + child._delay; + if (child._paused) if (this !== child._timeline) { //we only adjust the _pauseTime if it wasn't in this timeline already. Remember, sometimes a tween will be inserted again into the same timeline when its startTime is changed so that the tweens in the TimelineLite/Max are re-ordered properly in the linked list (so everything renders in the proper order). + child._pauseTime = child._startTime + ((this.rawTime() - child._startTime) / child._timeScale); + } + if (child.timeline) { + child.timeline._remove(child, true); //removes from existing timeline so that it can be properly added to this one. + } + child.timeline = child._timeline = this; + if (child._gc) { + child._enabled(true, true); + } + prevTween = this._last; + if (this._sortChildren) { + st = child._startTime; + while (prevTween && prevTween._startTime > st) { + prevTween = prevTween._prev; + } + } + if (prevTween) { + child._next = prevTween._next; + prevTween._next = child; + } else { + child._next = this._first; + this._first = child; + } + if (child._next) { + child._next._prev = child; + } else { + this._last = child; + } + child._prev = prevTween; + this._recent = child; + if (this._timeline) { + this._uncache(true); + } + return this; + }; + + p._remove = function(tween, skipDisable) { + if (tween.timeline === this) { + if (!skipDisable) { + tween._enabled(false, true); + } + + if (tween._prev) { + tween._prev._next = tween._next; + } else if (this._first === tween) { + this._first = tween._next; + } + if (tween._next) { + tween._next._prev = tween._prev; + } else if (this._last === tween) { + this._last = tween._prev; + } + tween._next = tween._prev = tween.timeline = null; + if (tween === this._recent) { + this._recent = this._last; + } + + if (this._timeline) { + this._uncache(true); + } + } + return this; + }; + + p.render = function(time, suppressEvents, force) { + var tween = this._first, + next; + this._totalTime = this._time = this._rawPrevTime = time; + while (tween) { + next = tween._next; //record it here because the value could change after rendering... + if (tween._active || (time >= tween._startTime && !tween._paused)) { + if (!tween._reversed) { + tween.render((time - tween._startTime) * tween._timeScale, suppressEvents, force); + } else { + tween.render(((!tween._dirty) ? tween._totalDuration : tween.totalDuration()) - ((time - tween._startTime) * tween._timeScale), suppressEvents, force); + } + } + tween = next; + } + }; + + p.rawTime = function() { + if (!_tickerActive) { + _ticker.wake(); + } + return this._totalTime; + }; + +/* + * ---------------------------------------------------------------- + * TweenLite + * ---------------------------------------------------------------- + */ + var TweenLite = _class("TweenLite", function(target, duration, vars) { + Animation.call(this, duration, vars); + this.render = TweenLite.prototype.render; //speed optimization (avoid prototype lookup on this "hot" method) + + if (target == null) { + throw "Cannot tween a null target."; + } + + this.target = target = (typeof(target) !== "string") ? target : TweenLite.selector(target) || target; + + var isSelector = (target.jquery || (target.length && target !== window && target[0] && (target[0] === window || (target[0].nodeType && target[0].style && !target.nodeType)))), + overwrite = this.vars.overwrite, + i, targ, targets; + + this._overwrite = overwrite = (overwrite == null) ? _overwriteLookup[TweenLite.defaultOverwrite] : (typeof(overwrite) === "number") ? overwrite >> 0 : _overwriteLookup[overwrite]; + + if ((isSelector || target instanceof Array || (target.push && _isArray(target))) && typeof(target[0]) !== "number") { + this._targets = targets = _slice(target); //don't use Array.prototype.slice.call(target, 0) because that doesn't work in IE8 with a NodeList that's returned by querySelectorAll() + this._propLookup = []; + this._siblings = []; + for (i = 0; i < targets.length; i++) { + targ = targets[i]; + if (!targ) { + targets.splice(i--, 1); + continue; + } else if (typeof(targ) === "string") { + targ = targets[i--] = TweenLite.selector(targ); //in case it's an array of strings + if (typeof(targ) === "string") { + targets.splice(i+1, 1); //to avoid an endless loop (can't imagine why the selector would return a string, but just in case) + } + continue; + } else if (targ.length && targ !== window && targ[0] && (targ[0] === window || (targ[0].nodeType && targ[0].style && !targ.nodeType))) { //in case the user is passing in an array of selector objects (like jQuery objects), we need to check one more level and pull things out if necessary. Also note that ' + + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + + '
    ' + + + '' + + + '
    ' + + + '
    ' + + + '
    ' + + + '' + + + '
    ' + + + '' + + '' + + '' + + '' + + '' + + + '
    ' + + + '
    ' + + + '
    ' + + + '' + + '
    ' + + '' + + '
    ' + + '' + + '
    ' + + '' + + '' + + + '
    ' + + + '
    ' + + + '
    ' + + + '' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '' + + ' ' + + '' + + '' + + '' + + + '' + + ' ' + + '' + + '' + + '' + + + '
    ' + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '' + + '
    ' + + '
    ' + + '
    ' + + '' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + '
    ' + + '
    {{delete}}
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + '
    ' + + '
    {{delete}}
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '' + + + '
    ' + + + '' + + '' + + '' + + '' + + '' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '' + + '' + + '' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + '' + + '
    ' + + '' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '
    ' + + + '' + + + '' + + + '' + + + '
    ' + + + '
    ' + + + '' + + + '
    ' + + + '
    ' + + + '' + + '' + + '' + + + '
    ' + + + '
    ' + + + '' + + + ''; + + function changeDegree(grad, deg) { + + grad = grad.split('('); + + var begin = grad[0]; + grad.shift(); + + var end = grad.join('(').split(','); + end.shift(); + + deg = typeof deg !== 'undefined' ? deg + 'deg,' : 'ellipse at center,'; + return begin + '(' + deg + end.join(','); + + } + + function gradientView(val) { + + return changeDegree(val.replace('radial-', 'linear-'), '90'); + + } + + function replaceText() { + + this.innerHTML = curLanguage[getAttribute(this, 'data-text')]; + + } + + function replaceHolder() { + + this.setAttribute('placeholder', curLanguage[getAttribute(this, 'data-placeholder')]); + + } + + function replaceAlert() { + + this.setAttribute('data-message', curLanguage[getAttribute(this, 'data-alert')]); + + } + + function getAttribute(el, attr) { + + return el.getAttribute(attr) || ''; + + } + + function writeLanguage(language) { + + if(!language) language = {}; + if(typeof language === 'string') language = JSON.parse(language.replace(/\&/g, '"')); + + curLanguage = $.extend({}, lang, language); + langColor = curLanguage.color; + + cPicker.find('*[data-placeholder]').each(replaceHolder); + cPicker.find('*[data-alert]').each(replaceAlert); + cPicker.find('*[data-text]').each(replaceText); + + } + + function newPreset(val, core, cls, grad) { + + var titl, + obj, + el; + + if(!$.isPlainObject(val)) { + + titl = val; + + } + else { + + var angl, + tpe; + + for(var prop in val) { + + if(!val.hasOwnProperty(prop)) continue; + + val = val[prop]; + if(typeof val === 'string') { + + val = RevColor.process(val); + if(val[1] === 'gradient') { + + obj = val[2]; + angl = obj.angle; + tpe = obj.type; + + } + + val = val[0]; + + } + else { + + angl = val.angle; + tpe = val.type; + + } + + if(!isNaN(prop)) { + + titl = tpe !== 'radial' ? angl + '°' : 'radial'; + + } + else { + + titl = prop.replace(/_/g, ' ').replace(/\b\w/g, function(chr) {return chr.toUpperCase();}); + + } + + } + + } + + if(val !== 'blank') { + + var datas; + if($.isPlainObject(val)) { + + obj = val; + datas = ''; + val = grad || RevColor.processGradient(val); + + } + + var shell = '' + + '' + + ''; + + if(!core) shell += ''; + shell += ''; + + el = $(shell); + if(obj) el.data('gradient', obj); + return el[0]; + + } + else { + + el = document.createElement('span'); + el.className = 'rev-cpicker-color blank'; + return el; + + } + + } + + function checkPreset() { + + var presetColor = getAttribute(this, 'data-color').toLowerCase(), + toCheck = !supressCheck ? presetColor === openingColor.toLowerCase() : false; + + if(presetColor === selectedHex || toCheck) { + + var $this = $(this); + + $this.closest('.rev-cpicker-presets-group').find('.rev-cpicker-color.selected').removeClass('selected'); + selectedColor = $this; + + if(supressCheck && !colorView) setValue(selectedColor.data('gradient'), true); + selectedColor.addClass('selected'); + + return false; + + } + + } + + function writePresets(container, colors) { + + var frag = document.createDocumentFragment(), + core = container.search('core') !== -1, + cls = core ? '' : ' rev-picker-color-custom', + len = colors.length, + minRows = container.search('colors') !== -1 ? minColorRows : minGradRows, + rows = Math.max(Math.ceil(len / presetColumns), minRows); + + for(var i = 0; i < rows; i++) { + + while(colors.length < ((i + 1) * presetColumns)) colors[colors.length] = 'blank'; + + } + + len = colors.length; + for(i = 0; i < len; i++) { + + frag.appendChild(newPreset(colors[i], core, cls)); + + } + + return ['rev-cpicker-' + container, frag]; + + } + + function onChange(gradient, color, trans) { + + if(!currentColor) return; + if(!gradient) { + + var hex = color || colorHex.val(), + opacity = typeof trans !== 'undefined' ? trans : colorOpacity.val(); + + if(hex === 'transparent') color = 'transparent'; + else if(opacity === '100%') color = RevColor.sanitizeHex(hex); + else color = RevColor.processRgba(hex, opacity); + + } + + var isTrans = color === 'transparent', + val = !isTrans ? color : ''; + + if(!gradient) colorBtn.data('state', color); + else gradBtn.data('state', color); + + if(!isTrans) currentColor[0].style.background = val; + else currentColor.css('background', val); + + if(onEdit) onEdit(currentInput, color); + doc.trigger('revcolorpickerupdate', [currentInput, color]); + + } + + function setValue(val, fromPreset) { + + var obj = RevColor.process(val), + type = obj[1], + clr = obj[0]; + + if(isFull) reverse.removeClass('checked'); + if(type !== 'gradient') { + + switch(type) { + + case 'hex': + + val = RevColor.sanitizeHex(clr); + colorOpacity.val('100%'); + updateSlider(100); + + break; + + case 'rgba': + + var values = RevColor.rgbaToHex(clr), + opacity = parseInt(values[1] * 100, 10); + val = values[0]; + + colorOpacity.val(opacity + '%'); + updateSlider(opacity); + + break; + + case 'rgb': + + val = RevColor.rgbToHex(clr); + colorOpacity.val('100%'); + updateSlider(100); + + break; + + default: + + colorClear.click(); + colorBtn.click(); + + // end default + + } + + colorIris.val(val).change(); + if(!fromPreset) colorBtn.click(); + + } + else { + + if(isFull) { + + buildGradientInput(obj[2]); + buildGradientOutput(); + + if(!fromPreset) { + + gradViewed = true; + gradBtn.click(); + + } + + } + else { + + colorIris.val(RevColor.defaultValue).change(); + colorBtn.click(); + + } + + } + + return [clr, type]; + + } + + function getSibling(align, x) { + + var locations = points.slice(), + len = locations.length, + pnt; + + locations.sort(sortPoints); + while(len--) { + + pnt = locations[len]; + if(pnt.align === align && pnt.x < x) return pnt; + + } + + len = locations.length; + for(var i = 0; i < len; i++) { + + pnt = locations[i]; + if(pnt.align === align && pnt.x > x) return pnt; + + } + + } + + function clonePoint(align, pos) { + + var sibling = getSibling(align, pos), + clr = sibling.color, + bg = getBgVal(clr, align, true), + rgb = getRgbVal(clr, true); + + var pnt = newPoint(align, pos, rgb, bg); + if(curPoint) curPoint.removeClass('active'); + + curPoint = $(pnt).addClass('active').appendTo(pointerWrap).draggable(dragObj); + curSquare = curPoint.children('.rev-cpicker-point-square')[0]; + curCorner = curPoint.children('.rev-cpicker-point-triangle')[0]; + groupPoints = pointerWrap.children(); + + var grad = activatePoint(pos); + buildGradientOutput(pnt); + + if(align === 'bottom') gradIris.val(grad[1]).change(); + + } + + function activatePoint(pointX) { + + if(typeof pointX === 'undefined') pointX = points[pointIndex].x; + + var color = curPoint.attr('data-color'), + bottom = curPoint.hasClass('rev-cpicker-point-bottom'); + + if(bottom) { + + if(opacityDelete.hasClass('active')) { + + gradOpacity.attr('disabled', 'disabled'); + opacityLoc.attr('disabled', 'disabled'); + opacityDelete.removeClass('active'); + + } + + color = RevColor.rgbaToHex(color)[0]; + colorBox.css('background', color); + colorLoc.removeAttr('disabled').val(pointX + '%'); + + if(cPicker.find('.rev-cpicker-point-bottom').length > 2) { + colorDelete.addClass('active'); + } + + cPicker.addClass('open'); + + } + else { + + if(colorDelete.hasClass('active')) { + + colorBox.css('background', ''); + colorLoc.attr('disabled', 'disabled'); + colorDelete.removeClass('active'); + + } + + var opacity = RevColor.getOpacity(color); + gradOpacity.attr('data-opacity', opacity).val(opacity).removeAttr('disabled'); + opacityLoc.val(pointX + '%').removeAttr('disabled'); + + if(cPicker.find('.rev-cpicker-point-top').length > 2) { + opacityDelete.addClass('active'); + } + + cPicker.removeClass('open'); + + } + + return [bottom, color]; + + } + + function getBgVal(clr, align, cloned) { + + if(align === 'bottom') return 'rgb(' + clr.r + ',' + clr.g + ',' + clr.b + ')'; + var opacity = !cloned ? clr.a : '1'; + return 'rgba(0, 0, 0, ' + opacity + ')'; + + } + + function getRgbVal(clr, cloned) { + + var opacity = !cloned ? clr.a : '1'; + return 'rgba(' + clr.r + ',' + clr.g + ',' + clr.b + ',' + opacity + ')'; + + } + + function setPoints(colors) { + + var frag = document.createDocumentFragment(), + len = colors.length, + align, + clr; + + for(var i = 0; i < len; i++) { + + clr = colors[i]; + align = clr.align; + frag.appendChild( + + newPoint( + + align, + clr.position, + getRgbVal(clr), + getBgVal(clr, align) + + ) + + ); + + } + + if(groupPoints) groupPoints.draggable('destroy'); + pointerWrap.empty().append(frag); + groupPoints = pointerWrap.children().draggable(dragObj); + + } + + function newPoint(align, pos, val, bg) { + + var el = document.createElement('span'); + el.className = 'rev-cpicker-point rev-cpicker-point-' + align; + + if(typeof val === 'string') el.setAttribute('data-color', val); + else $(el).data('gradient', val); + + el.setAttribute('data-location', pos); + el.style.left = pos + '%'; + + if(align === 'bottom') { + + el.innerHTML = + '' + + ''; + + } + else { + + el.innerHTML = + '' + + ''; + + } + + return el; + + } + + function getDegree(val) { + + if(!val || val === 'radial') val = '0'; + textareas.innerHTML = val + '°'; + return textareas.value; + + } + + function deactivate() { + + if(curPoint) { + + curPoint.removeClass('active'); + curPoint = false; + + } + + colorLoc.attr('disabled', 'disabled'); + gradOpacity.attr('disabled', 'disabled'); + opacityLoc.attr('disabled', 'disabled'); + + opacityDelete.removeClass('active'); + colorDelete.removeClass('active'); + + colorBox.css('background', ''); + cPicker.removeClass('open'); + + } + + function onClose(e, changed) { + + cPicker.removeClass('active is-basic').hide(); + bodies.removeClass('rev-colorpicker-open'); + mainContainer.css({left: '', top: ''}); + + if(appended) { + + appended.remove(); + appended = false; + + } + + if(selectedColor) { + + if(selectedColor.hasClass('selected')) { + + if(changed) currentInput.data('hex', selectedColor.attr('data-color').toLowerCase()); + selectedColor.removeClass('selected'); + + } + else { + + currentInput.removeData('hex'); + + } + + selectedColor = false; + + } + else { + + currentInput.removeData('hex'); + + } + + if(!changed) { + + if(onCancel) onCancel(); + if(openingValue && openingValue !== 'transparent') { + + currentColor[0].style.background = openingValue; + + } + else { + + currentColor.css('background', ''); + + } + + doc.trigger('revcolorpickerupdate', [currentInput, openingValue]); + + } + + currentColor = false; + currentInput = false; + + } + + function checkGroup() { + + var $this = $(this), + len = $this.children('.rev-cpicker-color').not('.blank').length; + + if(len > presetColumns) $('#' + this.id + '-btn').addClass('multiplerows'); + else $('#' + this.id + '-btn').removeClass('multiplerows'); + + return len; + + } + + function checkRows() { + + var $this = $(this), + minRows = this.id.search('colors') !== -1 ? minColorRows : minGradRows, + colors = $this.children('.rev-cpicker-color'), + len = colors.length, + rows = Math.ceil(len / presetColumns), + minItems = minRows * presetColumns, + rowRemoved; + + len += 1; + for(var i = 0; i < rows; i++) { + + var start = i * presetColumns, + range = colors.slice(start, parseInt(start + presetColumns, 10) - 1); + + blankRow = true; + range.each(checkRow); + if(blankRow) { + + len -= presetColumns; + if(len >= minItems) { + + range.remove(); + rowRemoved = true; + + } + + } + + } + + return rowRemoved; + + } + + function checkRow() { + + if(this.className.search('blank') === -1) { + + blankRow = false; + return false; + + } + + } + + function buildGradientInput(obj) { + + var degree = obj.angle; + if(obj.type === 'radial') degree = 'radial'; + + directions.removeClass('selected'); + $('.rev-cpicker-orientation[data-direction="' + degree + '"]').addClass('selected'); + + angle.val(getDegree(degree)); + updateWheel(degree); + setPoints(obj.colors); + + } + + function buildGradientOutput(el, revrse, save) { + + onReverse = revrse; + calculatePoints(); + onReverse = false; + + var elm, + color, + point, + ar = [], + len = points.length; + + for(var i = 0; i < len; i++) { + + point = points[i]; + color = point.color; + ar[i] = color; + + elm = point.el; + elm.setAttribute('data-color', RevColor.rgbaString(color.r, color.g, color.b, color.a)); + elm.setAttribute('data-opacity', color.a * 100); + + if(el && el === elm) pointIndex = i; + + } + + if(!radial.hasClass('selected')) { + + gradientPreview.type = 'linear'; + gradientPreview.angle = parseInt(angle.val(), 10).toString(); + + } + else { + + gradientPreview.type = 'radial'; + gradientPreview.angle = '0'; + + } + + gradientPreview.colors = ar; + if(selectedColor) selectedColor.removeClass('selected'); + + var gradient = RevColor.processGradient(gradientPreview); + onChange(true, gradient); + + if(!save) { + + gradInput.style.background = gradientView(gradient); + gradOutput.style.background = gradient; + + } + else { + + return [gradientPreview, gradient]; + + } + + } + + function back(i, align) { + + if(i === 0) return false; + + var pnt; + while(i--) { + + pnt = points[i]; + if(pnt.align !== align) return pnt; + + } + + return false; + + } + + function front(i, align, len) { + + if(i === len) return false; + + var pnt; + while(i++ < len) { + + pnt = points[i]; + if(pnt.align !== align) return pnt; + + } + + return false; + + } + + function dist(px, bx, ex, bv, ev) { + + return Math.max(Math.min(Math.round(Math.abs((((px - bx) / (ex - bx)) * (ev - bv)) + bv)), 255), 0); + + } + + function distAlpha(px, bx, ex, bv, ev) { + + return Math.max(Math.min(Math.abs(parseFloat((((px - bx) / (ex - bx)) * (ev - bv)).toFixed(2)) + parseFloat(bv)), 1), 0); + + } + + function adjustAlpha(point, begin, end) { + + var val, + beginAlpha = begin.alpha, + endAlpha = end.alpha; + + if(beginAlpha !== endAlpha) { + + val = distAlpha(point.x, begin.x, end.x, beginAlpha, endAlpha).toFixed(2); + + } + else { + + val = beginAlpha; + + } + + point.alpha = val; + point.color.a = val; + + } + + function adjustColor(point, begin, end) { + + var p = point.color, + bv = begin.color, + ev = end.color; + + if(begin !== end) { + + var px = point.x, + bx = begin.x, + ex = end.x; + + p.r = dist(px, bx, ex, bv.r, ev.r); + p.g = dist(px, bx, ex, bv.g, ev.g); + p.b = dist(px, bx, ex, bv.b, ev.b); + + } + else { + + p.r = bv.r; + p.g = bv.g; + p.b = bv.b; + + } + + } + + function calculatePoints() { + + points = []; + topPoints = []; + botPoints = []; + + groupPoints.each(getPoints); + points.sort(sortPoints); + + var len = points.length, + iLen = len - 1, + point, + begin, + tpe, + end; + + for(var i = 0; i < len; i++) { + + point = points[i]; + tpe = point.align; + + begin = back(i, tpe); + if(begin === false) begin = front(i, tpe, iLen); + + end = front(i, tpe, iLen); + if(end === false) end = back(i, tpe); + + if(tpe === 'bottom') adjustAlpha(point, begin, end); + else adjustColor(point, begin, end); + + } + + points.sort(sortPoints); + + } + + function sortPoints(a, b) { + + return a.x < b.x ? -1 : a.x > b.x ? 1 : 0; + + } + + function getPoints(i) { + + var rgba = RevColor.rgbValues(getAttribute(this, 'data-color'), 4), + align = this.className.search('bottom') !== -1 ? 'bottom' : 'top', + alpha = rgba[3].replace(/\.?0*$/, '') || 0, + pos = parseInt(this.style.left, 10); + + if(onReverse) { + + if(pos < 50) pos += (50 - pos) * 2; + else pos -= (pos - 50) * 2; + + this.style.left = pos + '%'; + this.setAttribute('data-location', pos); + + } + + points[i] = { + + el: this, + x: pos, + alpha: alpha, + align: align, + color: { + + r: parseInt(rgba[0], 10), + g: parseInt(rgba[1], 10), + b: parseInt(rgba[2], 10), + a: alpha, + position: pos, + align: align + + } + + }; + + if(curPoint && curPoint[0] !== this) { + + if(align === 'bottom') botPoints[botPoints.length] = pos; + else topPoints[topPoints.length] = pos; + + } + + } + + function updateWheel(val) { + + val = typeof val !== 'undefined' ? val : parseInt(angle.val(), 10); + wheelPoint[0].style.transform = 'rotate(' + val + 'deg)'; + + } + + function onAngleChange(e, dir, wheel) { + + var isWheel = typeof wheel !== 'undefined', + val = isWheel ? wheel : parseInt(angle.val(), 10), + changed, + value; + + if(e && e.type === 'keyup') { + + changed = !isNaN(val) && val >= -360 && val <= 360; + value = val; + + } + else { + + var oValue = parseInt(angle.data('orig-value'), 10); + + if(!val) val = '0'; + if(isNaN(val) || val < -360 || val > 360) val = oValue; + if(val !== oValue) { + + value = val; + changed = true; + angle.val(getDegree(val)); + + if(!isWheel) { + + val = dir || val; + directions.removeClass('selected'); + $('.rev-cpicker-orientation[data-direction="' + val + '"]').addClass('selected'); + + } + + } + + } + + if(changed || dir) { + + if(value) updateWheel(value); + buildGradientOutput(); + + } + + } + + function onArrowClick() { + + var $this = $(this); + + if(this.className.search('down') !== -1) { + + $this.parent().addClass('active'); + $this.closest('.rev-cpicker-presets').addClass('active'); + $(this.id.replace('-btn', '')).addClass('active'); + gradientsOpen = cPicker.hasClass('gradient-view'); + + } + else { + + $this.parent().removeClass('active'); + $this.closest('.rev-cpicker-presets').removeClass('active'); + $(this.id.replace('-btn', '')).removeClass('active'); + gradientsOpen = false; + + } + + } + + function onDrag(e, ui) { + + var pos = parseInt((Math.round(ui.position.left) / (hitWidth - 2)).toFixed(2) * 100, 10); + if(dragPoint === 'bottom') colorLoc.val(pos + '%').trigger('keyup'); + else opacityLoc.val(pos + '%').trigger('keyup'); + + } + + function onDragStart() { + + var $this = $(this); + dragPoint = $this.hasClass('rev-cpicker-point-bottom') ? 'bottom' : 'top'; + $this.click(); + + } + + function onDragStop() { + + if(dragPoint === 'bottom') colorLoc.trigger('focusout'); + else opacityLoc.trigger('focusout'); + + } + + function updateSlider(opacity) { + + supressOpacity = true; + opacitySlider.slider('value', Math.round((opacity * 0.01) * sliderHeight)); + supressOpacity = false; + + } + + function wheelMove(e) { + + var offset = angleWheel.offset(), + posX = e.pageX - offset.left, + posY = e.pageY - offset.top; + + if(isNaN(posX) || isNaN(posY)) return; + + var val = Math.atan2(posY - centerWheel, posX - centerWheel) * (180 / Math.PI) + 90; + if(val < 0) val += 360; + + val = Math.max(0, Math.min(360, Math.round(val))); + val = 5 * (Math.round(val / 5)); + + supressWheel = true; + onAngleChange(false, false, val); + supressWheel = false; + + } + + function focusPatch(e) { + + e.stopImmediatePropagation(); + + } + + function init() { + + if(!prepped) $.tpColorPicker(); + + currentEditing = document.getElementById('rev-cpicker-current-edit'); + gradOutput = document.getElementById('rev-cpicker-gradient-output'); + gradInput = document.getElementById('rev-cpicker-gradient-input'); + editTitle = document.getElementById('rev-cpicker-edit-title'); + textareas = document.createElement('textarea'); + opacityDelete = $('#rev-cpicker-opacity-delete'); + pointerWrap = $('#rev-cpciker-point-container'); + opacityLoc = $('#rev-cpicker-opacity-location'); + presetGroups = $('.rev-cpicker-presets-group'); + colorOpacity = $('#rev-cpicker-color-opacity'); + radial = $('#rev-cpicker-orientation-radial'); + colorDelete = $('#rev-cpicker-color-delete'); + gradOpacity = $('#rev-cpicker-grad-opacity'); + colorLoc = $('#rev-cpicker-color-location'); + gradCore = $('#rev-cpicker-gradients-core'); + directions = $('.rev-cpicker-orientation'); + gradIris = $('#rev-cpicker-iris-gradient'); + wheelPoint = $('#rev-cpicker-wheel-point'); + gradSection = $('#rev-cpicker-gradients'); + colorIris = $('#rev-cpicker-iris-color'); + gradBtn = $('#rev-cpicker-gradient-btn'); + gradHex = $('#rev-cpicker-gradient-hex'); + colorClear = $('#rev-cpciker-clear-hex'); + reverse = $('#rev-cpicker-meta-reverse'); + hitBottom = $('#rev-cpicker-hit-bottom'); + opacitySlider = $('#rev-cpicker-scroll'); + colorSection = $('#rev-cpicker-colors'); + colorHex = $('#rev-cpicker-color-hex'); + colorBtn = $('#rev-cpicker-color-btn'); + colorBox = $('#rev-cpicker-color-box'); + angle = $('#rev-cpicker-meta-angle'); + angleWheel = $('#rev-cpicker-wheel'); + hitTop = $('#rev-cpicker-hit-top'); + mainContainer = $('#rev-cpicker'); + doc = $(document); + + dragObj.drag = onDrag; + dragObj.stop = onDragStop; + dragObj.start = onDragStart; + + colorBtn.data('state', colorSection.find('.rev-cpicker-color').eq(0).attr('data-color') || '#ffffff'); + gradBtn.data('state', gradSection.find('.rev-cpicker-color').eq(0).attr('data-color') || 'linear-gradient(0deg, rgba(255, 255, 255, 1) 0%, rgba(0, 0, 0, 1) 100%)'); + + mainContainer.draggable({containment: 'window', handle: '.rev-cpicker-draggable', stop: function() { + + mainContainer.css('height', 'auto'); + + }}); + + presetGroups.perfectScrollbar({wheelPropagation: false, suppressScrollX: true}); + + angleWheel.on('mousedown.revcpicker', function(e) { + + directions.removeClass('selected'); + wheelDown = true; + wheelMove(e); + + }).on('mousemove.revcpicker', function(e) { + + if(!wheelDown) return; + wheelMove(e); + + }).on('mouseleave.revcpicker mouseup.revcpicker', function() { + + wheelDown = false; + + }); + + $('.rev-cpicker-main-btn').on('click.revcpicker', function() { + + var $this, + state; + + colorView = this.id.search('gradient') === -1; + if(currentColor) { + + $this = $(this); + state = $this.data('state'); + + } + + if(colorView) { + + if(currentColor) selectedHex = colorHex.val(); + cPicker.removeClass('gradient-view').addClass('color-view'); + + } + else { + + if(currentColor) selectedHex = state; + + cPicker.removeClass('color-view').addClass('gradient-view'); + if(!gradViewed) gradCore.children('.rev-cpicker-color').not('.blank').eq(0).click(); + + } + + presetGroups.perfectScrollbar('update'); + if(state) { + + var isTrans = state === 'transparent', + val = !isTrans ? state : ''; + + if(!isTrans) currentColor[0].style.background = val; + else currentColor.css('background', val); + + supressCheck = true; + $('.rev-cpicker-color').not('.blank').each(checkPreset); + supressCheck = false; + + doc.trigger('revcolorpickerupdate', [currentInput, state]); + + } + + }); + + $('#rev-cpicker-check').on('click.revcipicker', function() { + + var ar, + color, + changed; + + if(cPicker.hasClass('color-view')) { + + var hex = colorHex.val(), + opacity = colorOpacity.val(); + + currentInput.removeData('gradient'); + if(hex === 'transparent') color = 'transparent'; + else if(opacity === '100%') color = RevColor.sanitizeHex(hex); + else color = RevColor.processRgba(hex, opacity); + ar = [currentInput, color, false]; + + } + else { + + deactivate(); + + var grad = buildGradientOutput(false, false, true), + obj = $.extend({}, grad[0]), + clr = grad[1]; + + currentInput.data('gradient', clr); + color = JSON.stringify(obj).replace(/\"/g, '&'); + ar = [currentInput, clr, obj]; + + } + + changed = ar[1] !== openingValue; + if(changed) { + + currentInput.attr('data-color', ar[1]).val(color).change(); + doc.trigger('revcolorpicker', ar); + if(changeCallback) changeCallback(ar[0], ar[1], ar[2]); + + } + + onClose(false, changed); + + }); + + cPicker.on('click.revcpicker', function(e) { + + if(cPicker.hasClass('open')) { + + var targt = e.target, + $this = $(targt), + ids = targt.id, + isTarget = targt.className.search('rev-cpicker-point') !== -1 || + ids === 'rev-cpicker-section-right' || ids.search('hit') !== -1 || + $this.closest('#rev-cpicker-section-right, #rev-cpicker-point-wrap').length; + + if(isTarget) { + + if($this.attr('type') === 'text') { + + isTarget = !$this.attr('disabled'); + + } + else if(ids === 'rev-cpicker-check-gradient') { + + isTarget = false; + + } + + } + + if(!isTarget) deactivate(); + + } + else if(wheelActive && /wheel|angle|reverse/.test(e.target.id) === false) { + + if(e.target.id.search('radial') === -1) { + + $('.rev-cpicker-orientation[data-direction="' + parseInt(angle.val()) + '"]').addClass('selected'); + + } + + angleWheel.removeClass('active'); + wheelActive = false; + + } + + }); + + $('.rev-cpicker-close').on('click.revcpicker', onClose); + + colorIris.wpColorPicker({palettes: false, width: 267, border: false, hide: false, change: function(e, ui) { + + var val = ui.color.toString(); + this.value = val; + + colorHex.val(val); + if(!supressColor) { + + var opacity = colorOpacity.val(); + if(parseInt(opacity, 10) === 0) val = 'transparent'; + onChange(false, val, opacity); + + if(selectedColor) { + + selectedColor.removeClass('selected'); + selectedColor = false; + + } + + } + + }}); + + gradIris.wpColorPicker({palettes: false, height: 250, border: false, hide: false, change: function(e, ui) { + + var val = ui.color.toString(); + this.value = val; + + gradHex.val(val); + colorBox.css('background', val); + curSquare.style.backgroundColor = val; + curCorner.style.borderBottomColor = val; + + var rgba = RevColor.processRgba(val, 100), + parsed = RevColor.rgbValues(rgba, 4), + color = gradientPreview.colors[pointIndex]; + + color.r = parsed[0]; + color.g = parsed[1]; + color.b = parsed[2]; + color.a = parsed[3]; + + curPoint.attr('data-color', rgba); + buildGradientOutput(); + + }}); + + opacitySlider.slider({orientation: 'vertical', max: sliderHeight, value: sliderHeight, + + start: function() { + + isTransparent = colorHex.val() === 'transparent'; + + }, + + slide: function(e, ui) { + + if(!supressOpacity) { + + var opacity = parseInt((ui.value / sliderHeight).toFixed(2) * 100, 10), + val; + + if(isTransparent) { + + val = opacity ? '#ffffff' : 'transparent'; + colorHex.val(val); + + } + + if(opacity === 0) val = 'transparent'; + onChange(false, val, opacity || 'transparent'); + colorOpacity.val(opacity + '%'); + + } + + } + + }); + + $('.rev-cpicker-point-location').on('keyup.revcpicker focusout.revcpicker', function(e) { + + if(!curPoint) return; + + var align = curPoint.hasClass('rev-cpicker-point-bottom') ? 'bottom' : 'top', + locations = align === 'bottom' ? botPoints : topPoints, + input = align === 'bottom' ? colorLoc : opacityLoc, + point = input.val().replace('%', '') || '0', + evt = e.type, + dir; + + if(isNaN(point)) point = evt === 'keyup' ? '0' : curPoint.attr('data-location'); + point = Math.max(0, Math.min(100, parseInt(point, 10))); + + dir = point < 50 ? 1 : -1; + + while(locations.indexOf(point) !== -1) point += dir; + + if(evt === 'focusout') { + + input.val(point + '%'); + curPoint.attr('data-location', point); + + } + + curPoint.css('left', point + '%'); + buildGradientOutput(); + + }).on('focusin.revcpicker', focusPatch); + + $('body').on('click.revcpicker', '.rev-cpicker-point', function() { + + pointerWrap.find('.rev-cpicker-point.active').removeClass('active'); + curPoint = $(this).addClass('active'); + + curSquare = curPoint.children('.rev-cpicker-point-square')[0]; + curCorner = curPoint.children('.rev-cpicker-point-triangle')[0]; + + buildGradientOutput(this); + selectedColor = false; + + var grad = activatePoint(); + if(grad[0]) gradIris.val(grad[1]).change(); + + }).on('mousedown.revcpicker', '.rev-cpicker-point', function(e) { + + curPoint = $(this).data('mousestart', e.pageY); + + }).on('mousemove.revcpicker', function(e) { + + if(!curPoint || !curPoint.data('mousestart')) return; + + var start = curPoint.data('mousestart'), + posY = e.pageY; + + if(curPoint.hasClass('rev-cpicker-point-bottom')) { + + if(posY > start && posY - start > warningBuffer && colorDelete.hasClass('active')) { + curPoint.addClass('warning'); + } + else { + curPoint.removeClass('warning'); + } + + } + else { + + if(start > posY && start - posY > warningBuffer && opacityDelete.hasClass('active')) { + curPoint.addClass('warning'); + } + else { + curPoint.removeClass('warning'); + } + + } + + }).on('mouseup.revcpicker', function(e) { + + if(!curPoint || !curPoint.data('mousestart')) return; + + var start = curPoint.data('mousestart'), + end = e.pageY; + + curPoint.removeData('mousestart'); + if(curPoint.hasClass('rev-cpicker-point-bottom')) { + + if(end > start && end - start > deleteBuffer && colorDelete.hasClass('active')) { + colorDelete.click(); + } + else { + curPoint.removeClass('warning'); + } + + } + else { + + if(start > end && start - end > deleteBuffer && opacityDelete.hasClass('active')) { + opacityDelete.click(); + } + else { + curPoint.removeClass('warning'); + } + + } + + }).on('change.revcpicker', '.rev-cpicker-component', function() { + + var $this = $(this), + val = $this.data('gradient') || $this.val() || 'transparent'; + + if(val === 'transparent' || RevColor.transparentRgba(val)) val = ''; + $this.data('tpcp').css('background', val); + + }).on('keypress.revcpicker', function(e) { + + if(cPicker.hasClass('active')) { + + var key = e.which; + if(key == 27) { + + onClose(); + + } + else if(key == 13 && inFocus) { + + inFocus.blur(); + + } + + } + + }).on('click.revcpicker', '.rev-cpicker-color:not(.blank)', function() { + + if(selectedColor) { + + if(selectedColor[0] === this && selectedColor.hasClass('selected')) return; + selectedColor.removeClass('selected'); + + } + + selectedColor = $(this); + + var ids = selectedColor.parent()[0].id, + tpe = ids.search('core') !== -1 ? 'core' : 'custom', + view = ids.search('colors') !== -1 ? 'colors' : 'gradients', + btn = $('#rev-cpicker-' + view + '-' + tpe + '-btn'); + + if(btn.hasClass('active')) btn.find('.rev-cpicker-arrow-up').click(); + if(cPicker.hasClass('color-view')) { + + var val = selectedColor.attr('data-color'); + + supressColor = true; + colorIris.val(val).change(); + if(colorHex.val() === 'transparent') colorHex.val(val.toLowerCase()); + supressColor = false; + + var opacity = colorOpacity.val(); + if(parseInt(opacity, 10) === 0) val = 'transparent'; + onChange(false, val, opacity); + + } + else { + + hitTop.removeClass('full'); + hitBottom.removeClass('full'); + + setValue(selectedColor.data('gradient'), true); + reverse.removeClass('checked'); + gradCore.find('.rev-cpicker-color.selected').removeClass('selected'); + + } + + selectedColor.addClass('selected'); + + }).on('mouseover.revcpicker', '.rev-cpicker-color:not(.blank)', function() { + + if(gradientsOpen) gradOutput.style.background = getAttribute(this, 'data-color'); + + }).on('mouseout.revcpicker', '.rev-cpicker-color:not(.blank)', function() { + + if(gradientsOpen) buildGradientOutput(); + + }).on('click.revcpicker', '.rev-cpicker-delete', function() { + + if(!onAjax) { + + console.log('Ajax callback not defined'); + return; + + } + + if(window.confirm(document.getElementById('rev-cpicker-remove-delete').innerHTML)) { + + cPicker.addClass('onajax onajaxdelete'); + + var $this = $(this), + colr = $this.parent(), + titl = colr.attr('data-title') || ''; + + if(!titl) { + + console.log('Preset does not have a name/title'); + return; + + } + + var group = $this.closest('.rev-cpicker-presets-group'), + ids = group[0].id, + tpe = ids.search('colors') !== -1 ? 'colors' : 'gradients'; + + doc.off('revcpicker_onajax_delete.revcpicker').on('revcpicker_onajax_delete.revcpicker', function(evt, err) { + + if(err) console.log(err); + + var group = $this.closest('.rev-cpicker-presets-group'), + scroller = group.find('.ps-scrollbar-x-rail'), + btn = $('#' + ids + '-btn'); + + colr.remove(); + + if(!checkRows.call(group[0])) { + + $('').insertBefore(scroller); + + } + else { + + group.perfectScrollbar('update'); + + } + + if(checkGroup.call(group[0]) < presetColumns + 1) { + + $('').insertBefore(scroller); + if(btn.hasClass('active')) btn.children('.rev-cpicker-arrow-up').click(); + + } + + cPicker.removeClass('onajax onajaxdelete'); + + }); + + titl = $.trim(titl.replace(/\W+/g, '_')).replace(/^\_|\_$/g, '').toLowerCase(); + onAjax('delete', titl, tpe, 'revcpicker_onajax_delete', currentInput); + + } + + return false; + + }); + + $('.rev-cpicker-save-preset-btn').on('click.revcpicker', function() { + + if(!onAjax) { + + console.log('Ajax callback not defined'); + return; + + } + + var presetGroup, + duplicateTitle, + $this = $(this), + input = $this.closest('.rev-cpicker-presets-save-as').find('.rev-cpicker-preset-save'), + titl = input.val(); + + if(!titl || !isNaN(titl)) { + + alert($this.attr('data-message')); + return; + + } + + presetGroup = cPicker.hasClass('color-view') ? 'colors' : 'gradients'; + titl = $.trim(titl.replace(/\W+/g, '_')).replace(/^\_|\_$/g, '').toLowerCase(); + + $('#rev-cpicker-' + presetGroup + '-custom').find('.rev-cpicker-color').not('.blank').each(function() { + + var atr = $.trim(getAttribute(this, 'data-title').replace(/\W+/g, '_')).replace(/^\_|\_$/g, '').toLowerCase(); + if(atr === titl) { + + alert($this.attr('data-message')); + duplicateTitle = true; + return false; + + } + + }); + + if(duplicateTitle) return; + cPicker.addClass('onajax onajaxsave'); + + var newColorValue = {}, + color, + grad; + + if(presetGroup === 'colors') { + + var hex = colorHex.val(), + opacity = colorOpacity.val(); + + if(hex === 'transparent') color = 'transparent'; + else if(opacity === '100%') color = RevColor.sanitizeHex(hex); + else color = RevColor.processRgba(hex, opacity); + + } + else { + + grad = gradOutput.style.background; + color = $.extend({}, buildGradientOutput(false, false, true)[0]); + + } + + newColorValue[titl] = color; + doc.off('revcpicker_onajax_save.revcpicker').on('revcpicker_onajax_save.revcpicker', function(evt, err) { + + if(err) { + + cPicker.removeClass('onajax onajaxsave'); + alert($this.attr('data-message')); + return; + + } + + var pre = $(newPreset(newColorValue, false, ' rev-picker-color-custom', grad)), + group = $('#rev-cpicker-' + presetGroup + '-custom'), + box = group.find('.rev-cpicker-color.blank'), + btn = $('#' + group[0].id + '-btn'); + + + if(box.length) pre.insertBefore(box.eq(0)); + else pre.insertBefore(group.find('.ps-scrollbar-x-rail')); + + $('#rev-cpicker-' + presetGroup + '-custom-btn').click(); + var len = checkGroup.call(group[0]); + + if(len > 6) { + + if(box.length) box.last().remove(); + btn.addClass('active').children('.rev-cpicker-arrow-down').click(); + group.perfectScrollbar('update'); + + } + + pre.click(); + cPicker.removeClass('onajax onajaxsave'); + + }); + + onAjax('save', newColorValue, presetGroup, 'revcpicker_onajax_save', currentInput); + + }); + + $('.rev-cpicker-preset-title').on('click.revcpicker', function() { + + var $this = $(this), + par = $this.parent(), + arrow = $this.hasClass('active') ? 'down' : 'up'; + + onArrowClick.call($this.find('.rev-cpicker-arrow-' + arrow)[0]); + + par.find('.rev-cpicker-preset-title').removeClass('selected'); + $this.addClass('selected'); + + par.find('.rev-cpicker-presets-group').hide(); + document.getElementById(this.id.replace('-btn', '')).style.display = 'block'; + + presetGroups.perfectScrollbar('update'); + + }); + + colorClear.on('click.revcpicker', function() { + + colorOpacity.val('0%'); + updateSlider(0); + colorIris.val(RevColor.defaultValue).change(); + colorHex.val('transparent'); + onChange(false, 'transparent'); + + }); + + cPicker.find('input[type="text"]').on('focusin.revcpicker', function() { + + inFocus = this; + + }).on('focusout.revcpicker', function() { + + inFocus = false; + + }); + + $('.rev-cpicker-input').on('focusin.revcpicker', function() { + + var $this = $(this); + $this.data('orig-value', $this.val()); + + }); + + $('.rev-cpicker-hex').on('focusout.revcpicker', function() { + + var $this, + oVal, + val; + + if(this.id === 'rev-cpicker-color-hex') { + + val = colorHex.val(); + if(val) { + + val = RevColor.sanitizeHex(val); + if(RevColor.isColor.test(val)) { + + colorHex.val(val); + + } + else { + + $this = $(this); + oVal = $this.data('orig-value'); + + if(oVal) { + + val = oVal; + colorHex.val(val); + + } + else { + + colorClear.click(); + return; + + } + + } + + } + else { + + val = 'transparent'; + + } + + colorIris.val(val).change(); + + } + else { + + val = gradHex.val() || RevColor.defaultValue; + val = RevColor.sanitizeHex(val); + + if(!RevColor.isColor.test(val)) { + + $this = $(this); + oVal = $this.data('orig-value'); + val = oVal ? oVal : RevColor.defaultValue; + + } + + gradHex.val(val); + gradIris.val(val).change(); + + } + + }).on('focusin.revcpicker', focusPatch); + + $('#rev-cpciker-clear-gradient').on('click.revcpicker', function() { + + gradIris.val(RevColor.defaultValue).change(); + + }); + + angle.on('keyup.revcpicker focusout.revcpicker', onAngleChange).on('focusin.revcpicker', function() { + + wheelActive = true; + angleWheel.addClass('active'); + + }).on('focusin.revcpicker', focusPatch); + + directions.on('click.revcpicker', function() { + + var $this = $(this), + dir = $this.attr('data-direction'); + + directions.removeClass('selected'); + $this.addClass('selected'); + + if(dir !== 'radial') angle.removeAttr('disabled').val(getDegree(dir)); + else angle.attr('disabled', 'disabled'); + + onAngleChange(false, dir); + + }); + + $('.rev-cpicker-point-delete').on('click.revcpicker', function() { + + if(this.className.search('active') === -1) return; + + var align = curPoint.hasClass('rev-cpicker-point-bottom') ? 'bottom' : 'top', + len = cPicker.find('.rev-cpicker-point-' + align).length; + + if(len > 2) { + + curPoint.draggable('destroy').remove(); + groupPoints = pointerWrap.children(); + + cPicker.click(); + buildGradientOutput(); + + } + + if(len <= maxPoints) { + + if(align === 'bottom') hitBottom.removeClass('full'); + else hitTop.removeClass('full'); + + } + + }); + + $('.rev-cpicker-preset-save').on('focusin.revcpicker', focusPatch); + $('.rev-cpicker-opacity-input').on('keyup.revcpicker focusout.revcpicker', function(e) { + + var isColor = this.id.search('grad') === -1, + $this = isColor ? colorOpacity : gradOpacity, + opacity = $this.val().replace('%', ''), + evt = e.type, + clr; + + if(isNaN(opacity)) opacity = evt === 'keyup' ? '0' : $(this).data('orig-value'); + opacity = Math.max(0, Math.min(100, opacity)); + + if(evt === 'focusout') { + + $this.val(opacity + '%'); + if(!isColor) curPoint.attr('data-opacity', opacity); + + } + + if(isColor) { + + var opaque = parseInt(opacity, 10), + val = opaque !== 0 ? false : 'transparent'; + + onChange(false, val, opacity); + updateSlider(opacity); + + } + else { + + var parsed = RevColor.rgbValues(curPoint.attr('data-color'), 3), + color = gradientPreview.colors[pointIndex]; + + opacity = (parseInt(opacity, 10) * 0.01).toFixed(2).replace(/\.?0*$/, ''); + + color.r = parsed[0]; + color.g = parsed[1]; + color.b = parsed[2]; + color.a = opacity; + + clr = RevColor.rgbaString(color.r, color.g, color.b, opacity); + curPoint.attr('data-color', clr); + buildGradientOutput(); + + clr = 'rgba(0, 0, 0, ' + opacity + ')'; + curSquare.style.backgroundColor = clr; + curCorner.style.borderTopColor = clr; + + } + + }).on('focusin.revcpicker', focusPatch); + + $('.rev-cpicker-builder-hit').on('click.revcpicker', function(e) { + + if(!points) calculatePoints(); + + var hit = parseInt(((e.pageX - hitTop.offset().left) / hitWidth).toFixed(2) * 100, 10), + align = this.id.search('bottom') !== -1 ? 'bottom' : 'top', + locations = align === 'bottom' ? botPoints : topPoints, + dir = hit < 50 ? 1 : -1; + + while(locations.indexOf(hit) !== -1) hit += dir; + if(align === 'bottom') { + + if(cPicker.find('.rev-cpicker-point-bottom').length < maxPoints) { + + clonePoint(align, hit); + selectedColor = false; + + } + else { + + hitBottom.addClass('full'); + + } + + } + else { + + if(cPicker.find('.rev-cpicker-point-top').length < maxPoints) { + + clonePoint(align, hit); + selectedColor = false; + + } + else { + + hitTop.addClass('full'); + + } + + } + + }); + + reverse.on('click.revcpicker', function() { + + var rev = !reverse.hasClass('checked'); + + if(rev) reverse.addClass('checked'); + else reverse.removeClass('checked'); + + buildGradientOutput(false, true); + + }); + + $('.rev-cpicker-arrow').on('click.revcpicker', onArrowClick); + inited = true; + + } + + function addPresets(sets) { + + var settings = $.extend({}, sets), + core = settings.core || {}, + custom = settings.custom, + container, + preset, + colors, + len, + el; + + if(!customAdded || custom) { + + len = 4; + customAdded = custom; + custom = customAdded || {'colors': [], 'gradients': []}; + + } + else { + + len = 2; + + } + + if(!core.colors) core.colors = defColors; + if(!core.gradients) core.gradients = defGradients; + + for(var i = 0; i < len; i++) { + + switch(i) { + + case 0: + + container = 'colors-core'; + colors = core.colors; + + break; + + case 1: + + container = 'gradients-core'; + colors = core.gradients; + + break; + + case 2: + + container = 'colors-custom'; + colors = custom.colors; + + break; + + case 3: + + container = 'gradients-custom'; + colors = custom.gradients; + + break; + + } + + preset = writePresets(container, colors.slice() || []); + el = $('#' + preset[0]); + el.find('.rev-cpicker-color').remove(); + el.prepend(preset[1]); + + } + + } + + $.tpColorPicker = function(settings) { + + if(!bodies) { + + bodies = $('body'); + cPicker = $('
    ' + markup + '
    ').appendTo(bodies); + + } + + if(!settings) settings = {}; + if(settings.core) { + + if(settings.core.colors) defColors = settings.core.colors; + if(settings.core.gradients) defGradients = settings.core.gradients; + + } + + addPresets(settings); + + if(!prepped) { + + writeLanguage(settings.language || lang); + defMode = settings.mode || 'full'; + + } + else { + + presetGroups.perfectScrollbar('update'); + if(settings.mode) defMode = settings.mode; + if(settings.language) writeLanguage(settings.language); + + } + + if(settings.init) onInit = settings.init; + if(settings.onAjax) defAjax = settings.onAjax; + if(settings.onEdit) defEdit = settings.onEdit; + if(settings.change) defChange = settings.change; + if(settings.cancel) defCancel = settings.cancel; + if(settings.widgetId) defWidgetId = settings.widgetId; + if(settings.defaultValue) RevColor.defaultValue = settings.defaultValue; + if(settings.wrapClasses) defaultClasses = settings.wrapClasses; + if(settings.appendedHtml) appendedHTML = settings.appendedHtml; + + prepped = true; + + }; + + var ColorPicker = { + + refresh: function() { + + var $this = $(this); + if($this.hasClass('rev-cpicker-component')) { + + var settings = $this.data('revcp') || {}, + val = $this.val() || settings.defaultValue || RevColor.defaultValue, + colorValue = RevColor.process(val); + + val = colorValue[0]; + colorValue = colorValue[1] !== 'rgba' || !RevColor.transparentRgba(val, true) ? val : ''; + + if(val !== 'transparent') $this.data('tpcp')[0].style.background = colorValue; + else $this.data('tpcp').css('background', ''); + + $this.attr('data-color', val).data('hex', val); + + } + + }, + + destroy: function() { + + var $this = $(this).removeData(); + $this.closest('.rev-cpicker-master-wrap').removeData().remove(); + + } + + }; + + function isFalsey(val) { + + if(/(?=.*false)(?=.*rgba)/.test(val)) return val.replace('false', '1'); + return false; + + } + + $.fn.tpColorPicker = function(settings) { + + if(settings && typeof settings === 'string') return this.each(ColorPicker[settings]); + + return this.each(function() { + + var $this = $(this); + if($this.hasClass('rev-cpicker-component')) { + + $this.tpColorPicker('refresh'); + return; + + } + + var wrap = $('').data('revcolorinput', $this), + box = $(''), + btn = $(''), + cls = $this.attr('data-wrap-classes'), + wrapper = $this.attr('data-wrapper'), + ids = $this.attr('data-wrap-id'), + txt = $this.attr('data-title'), + skin = $this.attr('data-skin'), + val = $this.val() || '', + falsey = isFalsey(val), + colorValue, + defValue; + + if(falsey) { + + val = falsey; + $this.val(falsey); + + } + + wrap.insertBefore($this).append([box, btn, $this]); + + if(settings && $.isPlainObject(settings)) { + + if(!wrapper) wrapper = settings.wrapper; + if(!cls) cls = settings.wrapClasses; + if(!skin) skin = settings.skin; + if(!ids) ids = settings.wrapId; + if(!txt) txt = settings.title; + + defValue = settings.defaultValue; + var sets = $this.data('revcp'); + + if(sets) settings = $.extend({}, sets, settings); + $this.data('revcp', settings); + + } + + if(!cls) cls = defaultClasses; + if(cls) wrap.addClass(cls); + if(ids) wrap.attr('id', ids); + if(!val) { + + val = defValue || RevColor.defaultValue; + $this.val(val); + + } + + colorValue = RevColor.process(val); + val = colorValue[0]; + + if(colorValue.length === 3) $this.val(val); + colorValue = colorValue[1] !== 'rgba' || !RevColor.transparentRgba(val, true) ? val : ''; + + if(colorValue !== 'transparent') box[0].style.background = colorValue; + + btn[0].innerHTML = txt || langColor || lang.color; + $this.attr({type: 'hidden', 'data-color': val}).data('tpcp', box).addClass('rev-cpicker-component'); + + if(skin) wrap.addClass(skin); + if(!wrapper) { + + wrap.addClass('rev-cpicker-master-wrap'); + + } + else { + + wrapper = $(wrapper).addClass('rev-cpicker-master-wrap'); + wrap.wrap(wrapper); + + } + + var initCallback = settings ? settings.init || onInit : false; + if(initCallback) initCallback(wrap, $this, val, settings); + + }); + + }; + + $(function() { + + $('body').on('click.revcpicker', '.rev-colorpicker', function() { + + if(!inited) init(); + currentInput = $(this).data('revcolorinput'); + + var widgetId = currentInput.attr('data-widget-id'), + html = currentInput.attr('data-appended-html'), + editing = currentInput.attr('data-editing'), + data = currentInput.attr('data-colors'), + mode = currentInput.attr('data-mode'), + settings = currentInput.data('revcp'), + lang = currentInput.attr('data-lang'), + settingsGradients, + customGradients, + settingsColors, + dataGradients, + customColors, + dataColors, + presets, + change, + cancel, + value, + edit, + ajax, + val; + + if(data) { + + data = JSON.parse(data.replace(/\&/g, '"')); + if(data.colors) dataColors = data.colors; + if(data.gradients) dataGradients = data.gradients; + + } + + if(settings) { + + var colorSets = settings.colors; + if(colorSets) { + + if(colorSets.core) { + + settingsColors = colorSets.core.colors; + settingsGradients = colorSets.core.gradients; + + } + + if(colorSets.custom) { + + customColors = colorSets.custom.colors; + customGradients = colorSets.custom.gradients; + + } + + } + + edit = settings.onEdit; + ajax = settings.onAjax; + change = settings.change; + cancel = settings.cancel; + + if(!lang) lang = settings.lang; + if(!mode) mode = settings.mode; + if(!html) html = settings.appendedHtml; + if(!editing) editing = settings.editing; + if(!widgetId) widgetId = settings.widgetId; + + } + + if(settingsGradients || settingsColors || customGradients || customColors || dataGradients || dataColors) { + + presets = {}; + if(settingsGradients || settingsColors || dataGradients || dataColors) { + + presets.core = { + + colors: dataColors || settingsColors || defColors, + gradients: dataGradients || settingsGradients || defGradients + + }; + + } + + if(customGradients || customColors) { + + presets.custom = { + + colors: customColors || defColors, + gradients: customGradients || defGradients + + }; + + } + + addPresets(presets); + + } + + if(!widgetId) widgetId = defWidgetId; + if(widgetId) cPicker[0].id = widgetId; + + if(!html) html = appendedHTML; + if(html) appended = $(html).appendTo(mainContainer); + + if(lang) writeLanguage(lang); + if(!mode) mode = defMode; + + if(!editing) { + + editing = ''; + editTitle.style.visibility = 'hidden'; + + } + else { + + editTitle.style.visibility = 'visible'; + + } + + currentEditing.innerHTML = editing; + + if(mode === 'single' || mode === 'basic') { + + isFull = false; + gradBtn.hide(); + colorBtn.show(); + if(mode === 'basic') cPicker.addClass('is-basic'); + + } + else { + + isFull = true; + gradBtn.show(); + colorBtn.show(); + + } + + val = currentInput.val() || currentInput.attr('data-color') || RevColor.defaultValue; + if(val.split('||').length > 1) { + + val = RevColor.joinToRgba(val); + currentInput.val(val); + + } + + value = setValue(val); + openingValue = value[0]; + + onEdit = edit || defEdit; + onAjax = ajax || defAjax; + onCancel = cancel || defCancel; + changeCallback = change || defChange; + + if(value[1] !== 'gradient') colorBtn.data('state', openingValue); + else gradBtn.data('state', openingValue); + + bodies.addClass('rev-colorpicker-open'); + currentColor = currentInput.data('tpcp'); + cPicker.data('revcpickerinput', currentInput).addClass('active').show(); + + presetGroups.each(checkGroup).perfectScrollbar('update'); + openingColor = currentInput.attr('data-color'); + + selectedHex = currentInput.data('hex'); + $('.rev-cpicker-color').not('.blank').each(checkPreset); + + }); + + }); + +})(jQuery !== 'undefined' ? jQuery : false); + + + + + + + + + + + diff --git a/fassets/rs-plugin/js/three.min.js b/fassets/rs-plugin/js/three.min.js new file mode 100644 index 0000000..f3ad495 --- /dev/null +++ b/fassets/rs-plugin/js/three.min.js @@ -0,0 +1,865 @@ +// threejs.org/license +(function(l,sa){"object"===typeof exports&&"undefined"!==typeof module?sa(exports):"function"===typeof define&&define.amd?define(["exports"],sa):sa(l.THREE=l.THREE||{})})(this,function(l){function sa(){}function D(a,b){this.x=a||0;this.y=b||0}function X(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:jf++});this.uuid=Y.generateUUID();this.name="";this.image=void 0!==a?a:X.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:X.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT= +void 0!==d?d:1001;this.magFilter=void 0!==e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new D(0,0);this.repeat=new D(1,1);this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function ga(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function Db(a,b,c){this.uuid=Y.generateUUID();this.width= +a;this.height=b;this.scissor=new ga(0,0,a,b);this.scissorTest=!1;this.viewport=new ga(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new X(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?c.depthTexture:null}function Eb(a,b,c){Db.call(this,a,b,c);this.activeMipMapLevel= +this.activeCubeFace=0}function qa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function p(a,b,c){this.x=a||0;this.y=b||0;this.z=c||0}function J(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0=d||0 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n")); +w.compileShader(P);w.compileShader(K);w.attachShader(ja,P);w.attachShader(ja,K);w.linkProgram(ja);F=ja;x=w.getAttribLocation(F,"position");v=w.getAttribLocation(F,"uv");c=w.getUniformLocation(F,"uvOffset");d=w.getUniformLocation(F,"uvScale");e=w.getUniformLocation(F,"rotation");f=w.getUniformLocation(F,"scale");g=w.getUniformLocation(F,"color");h=w.getUniformLocation(F,"map");k=w.getUniformLocation(F,"opacity");m=w.getUniformLocation(F,"modelViewMatrix");u=w.getUniformLocation(F,"projectionMatrix"); +q=w.getUniformLocation(F,"fogType");n=w.getUniformLocation(F,"fogDensity");r=w.getUniformLocation(F,"fogNear");l=w.getUniformLocation(F,"fogFar");t=w.getUniformLocation(F,"fogColor");y=w.getUniformLocation(F,"alphaTest");ja=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");ja.width=8;ja.height=8;P=ja.getContext("2d");P.fillStyle="white";P.fillRect(0,0,8,8);aa=new X(ja);aa.needsUpdate=!0}w.useProgram(F);O.initAttributes();O.enableAttribute(x);O.enableAttribute(v);O.disableUnusedAttributes(); +O.disable(w.CULL_FACE);O.enable(w.BLEND);w.bindBuffer(w.ARRAY_BUFFER,S);w.vertexAttribPointer(x,2,w.FLOAT,!1,16,0);w.vertexAttribPointer(v,2,w.FLOAT,!1,16,8);w.bindBuffer(w.ELEMENT_ARRAY_BUFFER,E);w.uniformMatrix4fv(u,!1,Gb.projectionMatrix.elements);O.activeTexture(w.TEXTURE0);w.uniform1i(h,0);P=ja=0;(K=p.fog)?(w.uniform3f(t,K.color.r,K.color.g,K.color.b),K.isFog?(w.uniform1f(r,K.near),w.uniform1f(l,K.far),w.uniform1i(q,1),P=ja=1):K.isFogExp2&&(w.uniform1f(n,K.density),w.uniform1i(q,2),P=ja=2)): +(w.uniform1i(q,0),P=ja=0);for(var K=0,W=b.length;Kb&&(b=a[c]);return b}function M(){Object.defineProperty(this,"id",{value:Td++});this.uuid=Y.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate= +this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function I(){Object.defineProperty(this,"id",{value:Td++});this.uuid=Y.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity}}function Ca(a,b){B.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new I;this.material=void 0!==b? +b:new Na({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function Ib(a,b,c,d,e,f){M.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};this.fromBufferGeometry(new kb(a,b,c,d,e,f));this.mergeVertices()}function kb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,l,S,E,F){var aa=f/S,R=g/E,ca=f/2,la=g/2,D=l/2;g=S+1;var C=E+1,B=f=0,P,K,W=new p;for(K=0;K/gm,function(a,c){var d=U[c]; +if(void 0===d)throw Error("Can not resolve #include <"+c+">");return Vd(d)})}function Oe(a){return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);cb||a.height>b){var c=b/Math.max(a.width,a.height),d=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");d.width=Math.floor(a.width*c);d.height=Math.floor(a.height*c);d.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,d.width,d.height);console.warn("THREE.WebGLRenderer: image is too big ("+ +a.width+"x"+a.height+"). Resized to "+d.width+"x"+d.height,a);return d}return a}function k(a){return Y.isPowerOfTwo(a.width)&&Y.isPowerOfTwo(a.height)}function m(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function u(b){b=b.target;b.removeEventListener("dispose",u);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}g.textures--}function q(b){b=b.target; +b.removeEventListener("dispose",q);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.textures--}function n(b, +m){var n=d.get(b);if(0z;z++)t[z]=q||l?l?b.image[z].image:b.image[z]:h(b.image[z],e.maxCubemapSize);var p=k(t[0]),y=f(b.format),R=f(b.type);r(a.TEXTURE_CUBE_MAP,b,p);for(z=0;6>z;z++)if(q)for(var ca,la=t[z].mipmaps,D=0,B=la.length;Du;u++)e.__webglFramebuffer[u]=a.createFramebuffer()}else e.__webglFramebuffer=a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);r(a.TEXTURE_CUBE_MAP,b.texture,m);for(u=0;6>u;u++)l(e.__webglFramebuffer[u], +b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+u);b.texture.generateMipmaps&&m&&a.generateMipmap(a.TEXTURE_CUBE_MAP);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),r(a.TEXTURE_2D,b.texture,m),l(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),b.texture.generateMipmaps&&m&&a.generateMipmap(a.TEXTURE_2D),c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets"); +if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported!");a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate= +!0);n(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),t(e.__webglDepthbuffer[f], +b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),t(e.__webglDepthbuffer,b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture;e.generateMipmaps&&k(b)&&1003!==e.minFilter&&1006!==e.minFilter&&(b=b&&b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D,e=d.get(e).__webglTexture,c.bindTexture(b,e),a.generateMipmap(b),c.bindTexture(b,null))}}function eg(){var a={};return{get:function(b){b=b.uuid; +var c=a[b];void 0===c&&(c={},a[b]=c);return c},remove:function(b){delete a[b.uuid]},clear:function(){a={}}}}function fg(a,b,c){function d(b,c,d){var e=new Uint8Array(4),f=a.createTexture();a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b=na.maxTextures&&console.warn("WebGLRenderer: trying to use "+a+" texture units while this GPU supports only "+na.maxTextures);U+=1;return a};this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."), +a=!0),b=b.texture);sa.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);sa.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&& +6===b.image.length?sa.setTextureCube(b,c):sa.setTextureCubeDynamic(b,c)}}();this.getRenderTarget=function(){return P};this.setRenderTarget=function(a){(P=a)&&void 0===ia.get(a).__webglFramebuffer&&sa.setupRenderTarget(a);var b=a&&a.isWebGLRenderTargetCube,c;a?(c=ia.get(a),c=b?c.__webglFramebuffer[a.activeCubeFace]:c.__webglFramebuffer,Q.copy(a.scissor),L=a.scissorTest,Z.copy(a.viewport)):(c=null,Q.copy(ha).multiplyScalar(ka),L=Pe,Z.copy(zc).multiplyScalar(ka));K!==c&&(A.bindFramebuffer(A.FRAMEBUFFER, +c),K=c);fa.scissor(Q);fa.setScissorTest(L);fa.viewport(Z);b&&(b=ia.get(a.texture),A.framebufferTexture2D(A.FRAMEBUFFER,A.COLOR_ATTACHMENT0,A.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,b.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=function(a,b,c,d,e,f){if(!1===(a&&a.isWebGLRenderTarget))console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");else{var g=ia.get(a).__webglFramebuffer;if(g){var h=!1;g!==K&&(A.bindFramebuffer(A.FRAMEBUFFER, +g),h=!0);try{var k=a.texture,m=k.format,n=k.type;1023!==m&&y(m)!==A.getParameter(A.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===n||y(n)===A.getParameter(A.IMPLEMENTATION_COLOR_READ_TYPE)||1015===n&&(pa.get("OES_texture_float")||pa.get("WEBGL_color_buffer_float"))||1016===n&&pa.get("EXT_color_buffer_half_float")?A.checkFramebufferStatus(A.FRAMEBUFFER)===A.FRAMEBUFFER_COMPLETE?0<=b&& +b<=a.width-d&&0<=c&&c<=a.height-e&&A.readPixels(b,c,d,e,y(m),y(n),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&A.bindFramebuffer(A.FRAMEBUFFER,K)}}}}}function Kb(a,b){this.name="";this.color=new H(a);this.density=void 0!==b?b:2.5E-4}function Lb(a,b,c){this.name="";this.color= +new H(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function md(){B.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function Yd(a,b,c,d,e){B.call(this);this.lensFlares=[];this.positionScreen=new p;this.customUpdateCallback=void 0;void 0!==a&&this.add(a,b,c,d,e)}function cb(a){Z.call(this);this.type="SpriteMaterial";this.color=new H(16777215);this.map=null;this.rotation=0;this.lights=this.fog=!1;this.setValues(a)}function Ac(a){B.call(this); +this.type="Sprite";this.material=void 0!==a?a:new cb}function Bc(){B.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Cc(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else{console.warn("THREE.Skeleton boneInverses is the wrong length.");this.boneInverses=[];for(var c=0,d=this.bones.length;c=a.HAVE_CURRENT_DATA&&(u.needsUpdate=!0)}X.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1;var u=this;m()}function Nb(a,b,c,d,e,f,g,h,k,m,u,q){X.call(this,null,f,g,h,k,m,d,e,u,q);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function rd(a,b,c,d,e,f,g,h,k){X.call(this,a, +b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Ec(a,b,c,d,e,f,g,h,k,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);X.call(this,null,d,e,f,g,h,m,c,k);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Ob(a){I.call(this);this.type="WireframeGeometry";var b=[], +c,d,e,f,g=[0,0],h={},k,m,u=["a","b","c"];if(a&&a.isGeometry){var q=a.faces;c=0;for(e=q.length;cd;d++)k=n[u[d]],m=n[u[(d+1)%3]],g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]})}for(k in h)c=h[k],u=a.vertices[c.index1],b.push(u.x,u.y,u.z),u=a.vertices[c.index2],b.push(u.x,u.y,u.z)}else if(a&&a.isBufferGeometry){var r,u=new p;if(null!==a.index){q=a.attributes.position;n=a.index;r=a.groups;0===r.length&&(r=[{start:0,count:n.count, +materialIndex:0}]);a=0;for(f=r.length;ad;d++)k=n.getX(c+d),m=n.getX(c+(d+1)%3),g[0]=Math.min(k,m),g[1]=Math.max(k,m),k=g[0]+","+g[1],void 0===h[k]&&(h[k]={index1:g[0],index2:g[1]});for(k in h)c=h[k],u.fromBufferAttribute(q,c.index1),b.push(u.x,u.y,u.z),u.fromBufferAttribute(q,c.index2),b.push(u.x,u.y,u.z)}else for(q=a.attributes.position,c=0,e=q.count/3;cd;d++)h=3*c+d,u.fromBufferAttribute(q,h),b.push(u.x,u.y,u.z), +h=3*c+(d+1)%3,u.fromBufferAttribute(q,h),b.push(u.x,u.y,u.z)}this.addAttribute("position",new C(b,3))}function Fc(a,b,c){M.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Pb(a,b,c));this.mergeVertices()}function Pb(a,b,c){I.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,k=new p,m=new p,u=new p,q=new p,n,r,l=b+1;for(n=0;n<=c;n++){var t=n/c;for(r=0;r<=b;r++){var y= +r/b,k=a(y,t,k);e.push(k.x,k.y,k.z);0<=y-1E-5?(m=a(y-1E-5,t,m),u.subVectors(k,m)):(m=a(y+1E-5,t,m),u.subVectors(m,k));0<=t-1E-5?(m=a(y,t-1E-5,m),q.subVectors(k,m)):(m=a(y,t+1E-5,m),q.subVectors(m,k));h.crossVectors(u,q).normalize();f.push(h.x,h.y,h.z);g.push(y,t)}}for(n=0;nd&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}I.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};c=c||1;var h=[],k=[];(function(a){for(var c= +new p,d=new p,g=new p,h=0;he&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new C(h,3));this.addAttribute("normal",new C(h.slice(),3));this.addAttribute("uv",new C(k,2));this.normalizeNormals()}function Hc(a,b){M.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Qb(a,b)); +this.mergeVertices()}function Qb(a,b){ia.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ic(a,b){M.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new mb(a,b));this.mergeVertices()}function mb(a,b){ia.call(this,[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry"; +this.parameters={radius:a,detail:b}}function Jc(a,b){M.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Rb(a,b));this.mergeVertices()}function Rb(a,b){var c=(1+Math.sqrt(5))/2;ia.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry"; +this.parameters={radius:a,detail:b}}function Kc(a,b){M.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Sb(a,b));this.mergeVertices()}function Sb(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;ia.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18, +0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Lc(a,b,c,d,e,f){M.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Tb(a,b,c,d,e);this.tangents=a.tangents; +this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Tb(a,b,c,d,e){function f(e){var f=a.getPointAt(e/b),m=g.normals[e];e=g.binormals[e];for(q=0;q<=d;q++){var u=q/d*Math.PI*2,t=Math.sin(u),u=-Math.cos(u);k.x=u*m.x+t*e.x;k.y=u*m.y+t*e.y;k.z=u*m.z+t*e.z;k.normalize();l.push(k.x,k.y,k.z);h.x=f.x+c*k.x;h.y=f.y+c*k.y;h.z=f.z+c*k.z;n.push(h.x,h.y,h.z)}}I.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d, +closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,k=new p,m=new D,u,q,n=[],l=[],z=[],t=[];for(u=0;up;p++)g=r[k[p]],h=r[k[(p+1)%3]],e[0]=Math.min(g,h),e[1]=Math.max(g,h),g=e[0]+","+e[1],void 0=== +f[g]?f[g]={index1:e[0],index2:e[1],face1:l,face2:void 0}:f[g].face2=l;for(g in f)if(e=f[g],void 0===e.face2||m[e.face1].normal.dot(m[e.face2].normal)<=d)k=u[e.index1],c.push(k.x,k.y,k.z),k=u[e.index2],c.push(k.x,k.y,k.z);this.addAttribute("position",new C(c,3))}function ob(a,b,c,d,e,f,g,h){M.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Wa(a,b,c,d,e, +f,g,h));this.mergeVertices()}function Wa(a,b,c,d,e,f,g,h){function k(c){var e,f,k,t=new D,E=new p,F=0,aa=!0===c?a:b,R=!0===c?1:-1;f=z;for(e=1;e<=d;e++)l.push(0,y*R,0),n.push(0,R,0),r.push(.5,.5),z++;k=z;for(e=0;e<=d;e++){var C=e/d*h+g,B=Math.cos(C),C=Math.sin(C);E.x=aa*C;E.y=y*R;E.z=aa*B;l.push(E.x,E.y,E.z);n.push(0,R,0);t.x=.5*B+.5;t.y=.5*C*R+.5;r.push(t.x,t.y);z++}for(e=0;ethis.duration&&this.resetDuration();this.optimize()}function Hd(a){this.manager=void 0!==a?a:Aa;this.textures={}}function be(a){this.manager=void 0!==a?a:Aa}function gc(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}}function ce(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!== +a?a:Aa;this.withCredentials=!1}function Re(a){this.manager=void 0!==a?a:Aa;this.texturePath=""}function Se(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function xb(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function yb(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function na(){this.arcLengthDivisions=200}function Sa(a,b){this.arcLengthDivisions=200;this.v1=a;this.v2=b}function Yc(){this.arcLengthDivisions=200;this.curves= +[];this.autoClose=!1}function Xa(a,b,c,d,e,f,g,h){this.arcLengthDivisions=200;this.aX=a;this.aY=b;this.xRadius=c;this.yRadius=d;this.aStartAngle=e;this.aEndAngle=f;this.aClockwise=g;this.aRotation=h||0}function zb(a){this.arcLengthDivisions=200;this.points=void 0===a?[]:a}function hc(a,b,c,d){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c;this.v3=d}function ic(a,b,c){this.arcLengthDivisions=200;this.v0=a;this.v1=b;this.v2=c}function Zc(a){Yc.call(this);this.currentPoint=new D;a&&this.fromPoints(a)} +function Ab(){Zc.apply(this,arguments);this.holes=[]}function de(){this.subPaths=[];this.currentPath=null}function ee(a){this.data=a}function Te(a){this.manager=void 0!==a?a:Aa}function fe(a){this.manager=void 0!==a?a:Aa}function Ue(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new xa;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new xa;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=!1}function Id(a,b,c){B.call(this);this.type="CubeCamera"; +var d=new xa(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new xa(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new xa(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new xa(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new xa(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var k=new xa(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k);this.renderTarget=new Eb(c,c,{format:1022,magFilter:1006, +minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.updateCubeMap=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,n=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=n;c.activeCubeFace=5;a.render(b,k,c);a.setRenderTarget(null)}}function ge(a){xa.call(this); +this.enabled=!1;this.cameras=a||[]}function he(){B.call(this);this.type="AudioListener";this.context=ie.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function jc(a){B.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=!1;this.buffer=null;this.loop=!1;this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty"; +this.filters=[]}function je(a){jc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function ke(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function le(a,b,c){this.binding=a;this.valueSize=c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer= +new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function Ve(a,b,c){c=c||oa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function oa(a,b,c){this.path=b;this.parsedPath=c||oa.parseTrackName(b);this.node=oa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function We(a){this.uuid=Y.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var b={};this._indicesByUUID=b;for(var c=0,d=arguments.length;c!== +d;++c)b[arguments[c].uuid]=c;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var e=this;this.stats={objects:{get total(){return e._objects.length},get inUse(){return this.total-e.nCachedObjects_}},get bindingsPerObject(){return e._bindings.length}}}function Xe(a,b,c){this._mixer=a;this._clip=b;this._localRoot=c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings= +d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function Ye(a){this._root=a;this._initMemoryManager(); +this.time=this._accuIndex=0;this.timeScale=1}function Jd(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function me(){I.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function ne(a,b,c,d){this.uuid=Y.generateUUID();this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function kc(a,b){this.uuid=Y.generateUUID();this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange= +{offset:0,count:-1};this.onUploadCallback=function(){};this.version=0}function oe(a,b,c){kc.call(this,a,b);this.meshPerAttribute=c||1}function pe(a,b,c){L.call(this,a,b);this.meshPerAttribute=c||1}function Ze(a,b,c,d){this.ray=new hb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})} +function $e(a,b){return a.distance-b.distance}function qe(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;dc;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new C(b,3));b=new ha({fog:!1});this.cone=new da(a,b);this.add(this.cone); +this.update()}function mc(a){this.bones=this.getBoneList(a);for(var b=new I,c=[],d=[],e=new H(0,0,1),f=new H(0,1,0),g=0;ga?-1:0e;e++)8===e||13===e||18===e||23===e?b[e]="-":14===e?b[e]="4":(2>=c&&(c=33554432+16777216*Math.random()|0),d=c&15,c>>=4,b[e]=a[19===e?d&3|8:d]);return b.join("")}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c- +b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*Y.DEG2RAD},radToDeg:function(a){return a*Y.RAD2DEG}, +isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},nearestPowerOfTwo:function(a){return Math.pow(2,Math.round(Math.log(a)/Math.LN2))},nextPowerOfTwo:function(a){a--;a|=a>>1;a|=a>>2;a|=a>>4;a|=a>>8;a|=a>>16;a++;return a}};Object.defineProperties(D.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(D.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y= +this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a, +b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."), +this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x= +Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new D,b=new D;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,Math.min(b,c))/c)},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x); +this.y=Math.ceil(this.y);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},lengthManhattan:function(){return Math.abs(this.x)+ +Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length())},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+= +(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b); +return this},rotateAround:function(a,b){var c=Math.cos(b),d=Math.sin(b),e=this.x-a.x,f=this.y-a.y;this.x=e*c-f*d+a.x;this.y=e*d+f*c+a.y;return this}});var jf=0;X.DEFAULT_IMAGE=void 0;X.DEFAULT_MAPPING=300;Object.defineProperty(X.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(X.prototype,sa.prototype,{constructor:X,isTexture:!0,clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0); +this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){if(void 0!==a.textures[this.uuid])return a.textures[this.uuid];var b={metadata:{version:4.5, +type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],wrap:[this.wrapS,this.wrapT],minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==this.image){var c=this.image;void 0===c.uuid&&(c.uuid=Y.generateUUID());if(void 0===a.images[c.uuid]){var d=a.images,e=c.uuid,f=c.uuid,g;void 0!==c.toDataURL?g=c:(g=document.createElementNS("http://www.w3.org/1999/xhtml", +"canvas"),g.width=c.width,g.height=c.height,g.getContext("2d").drawImage(c,0,0,c.width,c.height));g=2048a.x||1a.x?0:1;break;case 1002:a.x= +1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.assign(ga.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this}, +setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x, +this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this}, +addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*= +a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/ +b);return this},setAxisAngleFromRotationMatrix:function(a){var b,c,d;a=a.elements;var e=a[0];d=a[4];var f=a[8],g=a[1],h=a[5],k=a[9];c=a[2];b=a[6];var m=a[10];if(.01>Math.abs(d-g)&&.01>Math.abs(f-c)&&.01>Math.abs(k-b)){if(.1>Math.abs(d+g)&&.1>Math.abs(f+c)&&.1>Math.abs(k+b)&&.1>Math.abs(e+h+m-3))return this.set(1,0,0,0),this;a=Math.PI;e=(e+1)/2;h=(h+1)/2;m=(m+1)/2;d=(d+g)/4;f=(f+c)/4;k=(k+b)/4;e>h&&e>m?.01>e?(b=0,d=c=.707106781):(b=Math.sqrt(e),c=d/b,d=f/b):h>m?.01>h?(b=.707106781,c=0,d=.707106781): +(c=Math.sqrt(h),b=d/c,d=k/c):.01>m?(c=b=.707106781,d=0):(d=Math.sqrt(m),b=f/d,c=k/d);this.set(b,c,d,a);return this}a=Math.sqrt((b-k)*(b-k)+(f-c)*(f-c)+(g-d)*(g-d));.001>Math.abs(a)&&(a=1);this.x=(b-k)/a;this.y=(f-c)/a;this.z=(g-d)/a;this.w=Math.acos((e+h+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z, +a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a=new ga,b=new ga;return function(c,d){a.set(c,c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this}, +ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this}, +negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length())}, +setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a= +[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});Object.assign(Db.prototype,sa.prototype,{isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0, +0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Eb.prototype=Object.create(Db.prototype);Eb.prototype.constructor=Eb;Eb.prototype.isWebGLRenderTargetCube=!0;Object.assign(qa,{slerp:function(a,b, +c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var u=e[f+1],l=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==u||m!==l){f=1-g;var n=h*d+k*u+m*l+c*e,r=0<=n?1:-1,p=1-n*n;p>Number.EPSILON&&(p=Math.sqrt(p),n=Math.atan2(p,n*r),f=Math.sin(f*n)/p,g=Math.sin(g*n)/p);r*=g;h=h*f+d*r;k=k*f+u*r;m=m*f+l*r;c=c*f+e*r;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*m+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});Object.defineProperties(qa.prototype,{x:{get:function(){return this._x}, +set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=a;this.onChangeCallback()}}});Object.assign(qa.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z, +this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!1===(a&&a.isEuler))throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=a._x,d=a._y,e=a._z,f=a.order,g=Math.cos,h=Math.sin,k=g(c/2),m=g(d/2),g=g(e/2),c=h(c/2),d=h(d/2),e=h(e/2);"XYZ"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"YXZ"===f?(this._x=c*m*g+ +k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"ZXY"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g-c*d*e):"ZYX"===f?(this._x=c*m*g-k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g+c*d*e):"YZX"===f?(this._x=c*m*g+k*d*e,this._y=k*d*g+c*m*e,this._z=k*m*e-c*d*g,this._w=k*m*g-c*d*e):"XZY"===f&&(this._x=c*m*g-k*d*e,this._y=k*d*g-c*m*e,this._z=k*m*e+c*d*g,this._w=k*m*g+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a, +b){var c=b/2,d=Math.sin(c);this._x=a.x*d;this._y=a.y*d;this._z=a.z*d;this._w=Math.cos(c);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6],b=b[10],m=c+f+b;0f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y= +.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new p,b;return function(c,d){void 0===a&&(a=new p);b=c.dot(d)+1;1E-6>b?(b=0,Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),inverse:function(){return this.conjugate().normalize()},conjugate:function(){this._x*= +-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this}, +multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z,f=a._w,g=b._x,h=b._y,k=b._z,m=b._w;this._x=c*m+f*g+d*k-e*h;this._y=d*m+f*h+e*g-c*k;this._z=e*m+f*k+c*h-d*g;this._w=f*m-c*g-d*h-e*k;this.onChangeCallback(); +return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;var h=Math.sqrt(1-g*g);if(.001>Math.abs(h))return this._w=.5*(f+this._w),this._x=.5*(c+this._x),this._y=.5*(d+this._y),this._z=.5*(e+this._z),this;var k=Math.atan2(h,g),g=Math.sin((1-b)*k)/h,h=Math.sin(b* +k)/h;this._w=f*g+this._w*h;this._x=c*g+this._x*h;this._y=d*g+this._y*h;this._z=e*g+this._z*h;this.onChangeCallback();return this},equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback= +a;return this},onChangeCallback:function(){}});Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x; +case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this}, +addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z= +a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new qa;return function(b){!1===(b&&b.isEuler)&&console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."); +return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new qa;return function(b,c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12];this.y=a[1]*b+a[5]*c+a[9]*d+a[13];this.z=a[2]*b+a[6]*c+a[10]*d+a[14]; +return this.divideScalar(a[3]*b+a[7]*c+a[11]*d+a[15])},applyQuaternion:function(a){var b=this.x,c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,m=a*d+e*c-f*b,b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-k*-e;return this},project:function(){var a=new J;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new J;return function(b){a.multiplyMatrices(b.matrixWorld, +a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x= +Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new p,b=new p;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.multiplyScalar(Math.max(a,Math.min(b,c))/c)},floor:function(){this.x=Math.floor(this.x); +this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x; +this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},lengthManhattan:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length())},setLength:function(a){return this.multiplyScalar(a/this.length())},lerp:function(a,b){this.x+=(a.x-this.x)* +b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b);var c=this.x,d=this.y,e=this.z;this.x=d*a.z-e*a.y;this.y=e*a.x-c*a.z;this.z=c*a.y-d*a.x;return this},crossVectors:function(a,b){var c=a.x,d=a.y,e=a.z,f=b.x,g=b.y,h=b.z;this.x=d*h-e*g;this.y= +e*f-c*h;this.z=c*g-d*f;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(Y.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))}, +distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},distanceToManhattan:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){return this.setFromMatrixColumn(a, +3)},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]= +this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(J.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,u,l,n,r,p,t){var y=this.elements;y[0]=a;y[4]=b;y[8]=c;y[12]=d;y[1]=e;y[5]=f;y[9]=g;y[13]=h;y[2]=k;y[6]=m;y[10]=u;y[14]=l;y[3]=n;y[7]=r;y[11]=p;y[15]=t;return this},identity:function(){this.set(1, +0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new J).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0); +b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new p;return function(b){var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;return this}}(), +makeRotationFromEuler:function(a){!1===(a&&a.isEuler)&&console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c),c=Math.sin(c),g=Math.cos(d),d=Math.sin(d),h=Math.cos(e),e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,m=c*h,u=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-u*d;b[9]=-c*g;b[2]=u-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,m=d*h,u=d*e,b[0]=a+u*c,b[4]=m*c-k,b[8]= +f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=u+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,u=d*e,b[0]=a-u*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=u-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,m=c*h,u=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*d+u,b[1]=g*e,b[5]=u*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,m=c*g,u=c*d,b[0]=g*h,b[4]=u-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+m,b[10]=a-u*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,u=c*d,b[0]= +g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+u,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=u*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(a){var b=this.elements,c=a._x,d=a._y,e=a._z,f=a._w,g=c+c,h=d+d,k=e+e;a=c*g;var m=c*h,c=c*k,u=d*h,d=d*k,e=e*k,g=f*g,h=f*h,f=f*k;b[0]=1-(u+e);b[4]=m-f;b[8]=c+h;b[1]=m+f;b[5]=1-(a+e);b[9]=d-g;b[2]=c-h;b[6]=d+g;b[10]=1-(a+u);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},lookAt:function(){var a=new p, +b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(c.z+=1E-4,a.crossVectors(f,c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)): +this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements,e=this.elements,f=c[0],g=c[4],h=c[8],k=c[12],m=c[1],u=c[5],l=c[9],n=c[13],r=c[2],p=c[6],t=c[10],y=c[14],x=c[3],v=c[7],G=c[11],c=c[15],w=d[0],O=d[4],S=d[8],E=d[12],F=d[1],C=d[5],R=d[9],D=d[13],B=d[2],I=d[6],H=d[10],J=d[14],P=d[3],K=d[7],W=d[11],d=d[15];e[0]=f*w+g*F+h*B+k*P;e[4]=f*O+g*C+h*I+k*K;e[8]=f*S+g*R+h*H+k*W;e[12]=f*E+g*D+h*J+k*d;e[1]=m*w+u* +F+l*B+n*P;e[5]=m*O+u*C+l*I+n*K;e[9]=m*S+u*R+l*H+n*W;e[13]=m*E+u*D+l*J+n*d;e[2]=r*w+p*F+t*B+y*P;e[6]=r*O+p*C+t*I+y*K;e[10]=r*S+p*R+t*H+y*W;e[14]=r*E+p*D+t*J+y*d;e[3]=x*w+v*F+G*B+c*P;e[7]=x*O+v*C+G*I+c*K;e[11]=x*S+v*R+G*H+c*W;e[15]=x*E+v*D+G*J+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c= +0,d=b.count;cthis.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;var f=1/h,m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*= +m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a, +b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),m=1/(f-e);g[0]=2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements; +a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});eb.prototype=Object.create(X.prototype);eb.prototype.constructor=eb;eb.prototype.isDataTexture=!0;Za.prototype=Object.create(X.prototype);Za.prototype.constructor=Za;Za.prototype.isCubeTexture=!0;Object.defineProperty(Za.prototype,"images",{get:function(){return this.image},set:function(a){this.image= +a}});var De=new X,Ee=new Za,ye=[],Ae=[],Ce=new Float32Array(16),Be=new Float32Array(9);Ie.prototype.setValue=function(a,b){for(var c=this.seq,d=0,e=c.length;d!==e;++d){var f=c[d];f.setValue(a,b[f.id])}};var Qd=/([\w\d_]+)(\])?(\[|\.)?/g;fb.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};fb.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};fb.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!== +h.needsUpdate&&g.setValue(a,h.value,d)}};fb.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var kg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535, +darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842, +fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762, +lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685, +navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331, +slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign(H.prototype,{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r= +a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,c,d){b=Y.euclideanModulo(b,1);c=Y.clamp(c,0,1);d=Y.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/ +3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r= +Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){var d=parseFloat(c[1])/360,e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^\#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+ +c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c-d)/k+(c 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn result;\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n", +bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n", +clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n", +clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n", +color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n", +cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n", +defaultnormal_vertex:"#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n", +emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:" gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n", +envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n", +envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n", +envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n", +fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n", +gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n", +lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n", +lights_pars:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltcMat;\tuniform sampler2D ltcMag;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n", +lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = BlinnExponentToGGXRoughness( material.specularShininess );\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n", +lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n", +lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n", +lights_template:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n", +logdepthbuf_fragment:"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n", +map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n", +metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n", +morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n", +normal_flip:"#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n",normal_fragment:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n", +normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n", +packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n", +premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n", +roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n", +shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n", +shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n", +shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n", +skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n", +skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n", +specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n", +uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n", +uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif", +uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n", +cube_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n", +depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +distanceRGBA_frag:"uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include \n#include \n#include \nvoid main () {\n\t#include \n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n",distanceRGBA_vert:"varying vec4 vWorldPosition;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition;\n}\n", +equirect_frag:"uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n", +linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n", +normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n", +normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n", +points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n", +shadow_frag:"uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n",shadow_vert:"#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"},ab={basic:{uniforms:Ha.merge([V.common, +V.aomap,V.lightmap,V.fog]),vertexShader:U.meshbasic_vert,fragmentShader:U.meshbasic_frag},lambert:{uniforms:Ha.merge([V.common,V.aomap,V.lightmap,V.emissivemap,V.fog,V.lights,{emissive:{value:new H(0)}}]),vertexShader:U.meshlambert_vert,fragmentShader:U.meshlambert_frag},phong:{uniforms:Ha.merge([V.common,V.aomap,V.lightmap,V.emissivemap,V.bumpmap,V.normalmap,V.displacementmap,V.gradientmap,V.fog,V.lights,{emissive:{value:new H(0)},specular:{value:new H(1118481)},shininess:{value:30}}]),vertexShader:U.meshphong_vert, +fragmentShader:U.meshphong_frag},standard:{uniforms:Ha.merge([V.common,V.aomap,V.lightmap,V.emissivemap,V.bumpmap,V.normalmap,V.displacementmap,V.roughnessmap,V.metalnessmap,V.fog,V.lights,{emissive:{value:new H(0)},roughness:{value:.5},metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:U.meshphysical_vert,fragmentShader:U.meshphysical_frag},points:{uniforms:Ha.merge([V.points,V.fog]),vertexShader:U.points_vert,fragmentShader:U.points_frag},dashed:{uniforms:Ha.merge([V.common,V.fog,{scale:{value:1}, +dashSize:{value:1},totalSize:{value:2}}]),vertexShader:U.linedashed_vert,fragmentShader:U.linedashed_frag},depth:{uniforms:Ha.merge([V.common,V.displacementmap]),vertexShader:U.depth_vert,fragmentShader:U.depth_frag},normal:{uniforms:Ha.merge([V.common,V.bumpmap,V.normalmap,V.displacementmap,{opacity:{value:1}}]),vertexShader:U.normal_vert,fragmentShader:U.normal_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:U.cube_vert,fragmentShader:U.cube_frag},equirect:{uniforms:{tEquirect:{value:null}, +tFlip:{value:-1}},vertexShader:U.equirect_vert,fragmentShader:U.equirect_frag},distanceRGBA:{uniforms:{lightPos:{value:new p}},vertexShader:U.distanceRGBA_vert,fragmentShader:U.distanceRGBA_frag}};ab.physical={uniforms:Ha.merge([ab.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:U.meshphysical_vert,fragmentShader:U.meshphysical_frag};Object.assign(id.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty(); +for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,b){return(b||new D).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y?!1:!0},clampPoint:function(a,b){return(b||new D).copy(a).clamp(this.min,this.max)}, +distanceToPoint:function(){var a=new D;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});var Kf=0;Object.assign(Z.prototype,sa.prototype,{isMaterial:!0,setValues:function(a){if(void 0!== +a)for(var b in a){var c=a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material", +generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearCoat&&(d.clearCoat= +this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&(d.lightMap=this.lightMap.toJSON(a).uuid);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid, +d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=this.emissiveMap.toJSON(a).uuid); +this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);2!==this.shading&&(d.shading=this.shading);0!==this.side&& +(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0e&&(e=m);l>f&&(f=l);q>g&&(g=q)}this.min.set(b,c,d);this.max.set(e, +f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;he&&(e=m);l>f&&(f=l);q>g&&(g=q)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;bthis.max.x||a.ythis.max.y||a.zthis.max.z?!1:!0},containsBox:function(a){return this.min.x<= +a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&a.max.z<=this.max.z},getParameter:function(a,b){return(b||new p).set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.xthis.max.x||a.max.ythis.max.y||a.max.zthis.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center, +a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){var b,c;0=a.constant},clampPoint:function(a, +b){return(b||new p).copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=new p;return function(b){b=b||new Ga;this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(){var a= +[new p,new p,new p,new p,new p,new p,new p,new p];return function(b){if(this.isEmpty())return this;a[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(b);a[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(b);a[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(b);a[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(b);a[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(b);a[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(b);a[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(b); +a[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(b);this.setFromPoints(a);return this}}(),translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(Ga.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Ta;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=0,f=0,g=b.length;f=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;return a.center.distanceToSquared(this.center)<= +b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(this.center.dot(a.normal)-a.constant)<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a),d=b||new p;d.copy(a);c>this.radius*this.radius&&(d.sub(this.center).normalize(),d.multiplyScalar(this.radius).add(this.center));return d},getBoundingBox:function(a){a=a||new Ta;a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a); +this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Ka.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=k;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b= +this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;cc;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]= +c[8];return a}});Object.assign(wa.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new p,b=new p;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)}, +copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){return this.orthoPoint(a,b).sub(a).negate()},orthoPoint:function(a, +b){var c=this.distanceToPoint(a);return(b||new p).copy(this.normal).multiplyScalar(c)},intersectLine:function(){var a=new p;return function(b,c){var d=c||new p,e=b.delta(a),f=this.normal.dot(e);if(0===f){if(0===this.distanceToPoint(b.start))return d.copy(b.start)}else return f=-(b.start.dot(this.normal)+this.constant)/f,0>f||1b&&0a&&0c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],h=c[5],k=c[6],m=c[7],l=c[8],q=c[9],n=c[10],r=c[11],p=c[12],t=c[13], +y=c[14],c=c[15];b[0].setComponents(f-a,m-g,r-l,c-p).normalize();b[1].setComponents(f+a,m+g,r+l,c+p).normalize();b[2].setComponents(f+d,m+h,r+q,c+t).normalize();b[3].setComponents(f-d,m-h,r-q,c-t).normalize();b[4].setComponents(f-e,m-k,r-n,c-y).normalize();b[5].setComponents(f+e,m+k,r+n,c+y).normalize();return this},intersectsObject:function(){var a=new Ga;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(), +intersectsSprite:function(){var a=new Ga;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)e;e++){var f=d[e];a.x=0g&&0>f)return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});Object.assign(hb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin); +this.direction.copy(a.direction);return this},at:function(a,b){return(b||new p).copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new p;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){var c=b||new p;c.subVectors(a,this.origin);var d=c.dot(this.direction);return 0>d?c.copy(this.origin):c.copy(this.direction).multiplyScalar(d).add(this.origin)}, +distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new p,b=new p,c=new p;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a); +var h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),l=-c.dot(b),q=c.lengthSq(),n=Math.abs(1-k*k),r;0=-r?e<=r?(h=1/n,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*l)+q):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+q):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+q):e<=-r?(d=Math.max(0,-(-k*h+m)),e=0f)return null;f=Math.sqrt(f-e);e=d-f;d+=f;return 0>e&&0>d?null:0>e?this.at(d,c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<= +a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){var c=this.distanceToPlane(a);return null===c?null:this.at(c,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,b){var c,d,e,f,g;d=1/this.direction.x;f=1/this.direction.y;g=1/this.direction.z; +var h=this.origin;0<=d?(c=(a.min.x-h.x)*d,d*=a.max.x-h.x):(c=(a.max.x-h.x)*d,d*=a.min.x-h.x);0<=f?(e=(a.min.y-h.y)*f,f*=a.max.y-h.y):(e=(a.max.y-h.y)*f,f*=a.min.y-h.y);if(c>f||e>d)return null;if(e>c||c!==c)c=e;if(fg||e>d)return null;if(e>c||c!==c)c=e;if(gd?null:this.at(0<=c?c:d,b)},intersectsBox:function(){var a=new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a= +new p,b=new p,c=new p,d=new p;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),applyMatrix4:function(a){this.direction.add(this.origin).applyMatrix4(a);this.origin.applyMatrix4(a); +this.direction.sub(this.origin);this.direction.normalize();return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});bb.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");bb.DefaultOrder="XYZ";Object.defineProperties(bb.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z= +a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this.onChangeCallback()}}});Object.assign(bb.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a, +b,c){var d=Y.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],l=e[2],q=e[6],e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=Math.atan2(-f,a)):(this._x=Math.atan2(q,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-l,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(q,-1,1)),.99999>Math.abs(q)?(this._y=Math.atan2(-l,e),this._z= +Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(l,-1,1)),.99999>Math.abs(l)?(this._x=Math.atan2(q,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-l,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(q,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+ +b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new J;return function(b,c,d){a.makeRotationFromQuaternion(b);return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new qa;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x= +a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Rd.prototype,{set:function(a){this.mask=1<=b.x+b.y}}()});Object.assign(Ua.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)}, +copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},area:function(){var a=new p,b=new p;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),midpoint:function(a){return(a||new p).addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(a){return Ua.normal(this.a,this.b,this.c,a)},plane:function(a){return(a||new wa).setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(a,b){return Ua.barycoordFromPoint(a, +this.a,this.b,this.c,b)},containsPoint:function(a){return Ua.containsPoint(a,this.a,this.b,this.c)},closestPointToPoint:function(){var a=new wa,b=[new Hb,new Hb,new Hb],c=new p,d=new p;return function(e,f){var g=f||new p,h=Infinity;a.setFromCoplanarPoints(this.a,this.b,this.c);a.projectPoint(e,c);if(!0===this.containsPoint(c))g.copy(c);else{b[0].set(this.a,this.b);b[1].set(this.b,this.c);b[2].set(this.c,this.a);for(var k=0;kd;d++)if(e[d]===e[(d+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(e=a[f],this.faces.splice(e,1),c=0,g=this.faceVertexUvs.length;cb.far?null:{distance:c,point:x.clone(),object:a}}function c(c,d,e,f,m,l,u,q){g.fromBufferAttribute(f,l);h.fromBufferAttribute(f,u);k.fromBufferAttribute(f,q);if(c=b(c,d,e,g,h,k,y))m&&(n.fromBufferAttribute(m,l),r.fromBufferAttribute(m,u),z.fromBufferAttribute(m,q),c.uv=a(y,g,h,k,n,r,z)),c.face=new Va(l,u,q,Ua.normal(g, +h,k)),c.faceIndex=l;return c}var d=new J,e=new hb,f=new Ga,g=new p,h=new p,k=new p,m=new p,l=new p,q=new p,n=new D,r=new D,z=new D,t=new p,y=new p,x=new p;return function(p,t){var w=this.geometry,x=this.material,C=this.matrixWorld;if(void 0!==x&&(null===w.boundingSphere&&w.computeBoundingSphere(),f.copy(w.boundingSphere),f.applyMatrix4(C),!1!==p.ray.intersectsSphere(f)&&(d.getInverse(C),e.copy(p.ray).applyMatrix4(d),null===w.boundingBox||!1!==e.intersectsBox(w.boundingBox)))){var E;if(w.isBufferGeometry){var F, +D,x=w.index,B=w.attributes.position,C=w.attributes.uv,ca,I;if(null!==x)for(ca=0,I=x.count;caf||(f=d.ray.origin.distanceTo(a),fd.far||e.push({distance:f,point:a.clone(),face:null,object:this}))}}(),clone:function(){return(new this.constructor(this.material)).copy(this)}}); +Bc.prototype=Object.assign(Object.create(B.prototype),{constructor:Bc,copy:function(a){B.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break; +for(;ef||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),td.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else for(g=0,z=r.length/3-1;gf||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),td.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;gf||(l.applyMatrix4(this.matrixWorld),t=d.ray.origin.distanceTo(l),td.far||e.push({distance:t,point:h.clone().applyMatrix4(this.matrixWorld), +index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});da.prototype=Object.assign(Object.create(ya.prototype),{constructor:da,isLineSegments:!0});pd.prototype=Object.assign(Object.create(ya.prototype),{constructor:pd,isLineLoop:!0});La.prototype=Object.create(Z.prototype);La.prototype.constructor=La;La.prototype.isPointsMaterial=!0;La.prototype.copy=function(a){Z.prototype.copy.call(this,a);this.color.copy(a.color); +this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;return this};Mb.prototype=Object.assign(Object.create(B.prototype),{constructor:Mb,isPoints:!0,raycast:function(){var a=new J,b=new hb,c=new Ga;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);if(fd.far||e.push({distance:m,distanceToRay:Math.sqrt(f),point:h.clone(),index:c,face:null,object:g})}}var g=this,h=this.geometry, +k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);c.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);var m=m/((this.scale.x+this.scale.y+this.scale.z)/3),l=m*m,m=new p;if(h.isBufferGeometry){var q=h.index,h=h.attributes.position.array;if(null!==q)for(var n=q.array,q=0,r=n.length;qc)return null;var d=[],e=[],f=[],g,h,k;if(0=m--){console.warn("THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()");break}g=h;c<=g&&(g=0);h=g+1;c<=h&&(h=0);k=h+1;c<=k&&(k=0);var l;a:{var q,n,r,p,t,y,x,v;q=a[e[g]].x;n=a[e[g]].y;r=a[e[h]].x;p=a[e[h]].y;t=a[e[k]].x;y=a[e[k]].y;if(0>=(r-q)*(y-n)-(p-n)*(t-q))l=!1;else{var G,w,O,C,E,F,D,B,I,H;G=t-r;w=y-p;O=q-t;C=n-y;E=r-q;F=p-n; +for(l=0;l=-Number.EPSILON&&B>=-Number.EPSILON&&D>=-Number.EPSILON)){l=!1;break a}l=!0}}if(l){d.push([a[e[g]],a[e[h]],a[e[k]]]);f.push([e[g],e[h],e[k]]);g=h;for(k=h+1;kNumber.EPSILON){if(0u||u>q)return[];k=m*l-k*n;if(0>k||k>q)return[]}else{if(0c?[]:k===c?f?[]:[g]:a<=c?[g,h]:[g,m]}function f(a,b,c,d){var e=b.x-a.x,f=b.y-a.y;b=c.x-a.x; +c=c.y-a.y;var g=d.x-a.x;d=d.y-a.y;a=e*c-f*b;e=e*d-f*g;return Math.abs(a)>Number.EPSILON?(b=g*c-d*b,0e&&(e=d);var g=a+1;g>d&&(g=0);d=f(h[a],h[e],h[g],k[b]);if(!d)return!1;d=k.length- +1;e=b-1;0>e&&(e=d);g=b+1;g>d&&(g=0);return(d=f(k[b],k[e],k[g],h[a]))?!0:!1}function d(a,b){var c,f;for(c=0;cJ){console.log("Infinite Loop! Holes left:"+ +m.length+", Probably Hole outside Shape!");break}for(n=D;nk;k++)l=m[k].x+":"+m[k].y,l=q[l],void 0!== +l&&(m[k]=l);return n.concat()},isClockWise:function(a){return 0>za.area(a)}};db.prototype=Object.create(M.prototype);db.prototype.constructor=db;Fa.prototype=Object.create(I.prototype);Fa.prototype.constructor=Fa;Fa.prototype.getArrays=function(){var a=this.getAttribute("position"),a=a?Array.prototype.slice.call(a.array):[],b=this.getAttribute("uv"),b=b?Array.prototype.slice.call(b.array):[],c=this.index,c=c?Array.prototype.slice.call(c.array):[];return{position:a,uv:b,index:c}};Fa.prototype.addShapeList= +function(a,b){var c=a.length;b.arrays=this.getArrays();for(var d=0;dNumber.EPSILON){var k= +Math.sqrt(h),m=Math.sqrt(d*d+g*g),h=b.x-f/k;b=b.y+e/k;g=((c.x-g/m-h)*g-(c.y+d/m-b)*d)/(e*g-f*d);d=h+e*g-a.x;e=b+f*g-a.y;f=d*d+e*e;if(2>=f)return new D(d,e);f=Math.sqrt(f/2)}else a=!1,e>Number.EPSILON?d>Number.EPSILON&&(a=!0):e<-Number.EPSILON?d<-Number.EPSILON&&(a=!0):Math.sign(f)===Math.sign(g)&&(a=!0),a?(d=-f,f=Math.sqrt(h)):(d=e,e=f,f=Math.sqrt(h/2));return new D(d/f,e/f)}function e(a,b){var c,d;for(N=a.length;0<=--N;){c=N;d=N-1;0>d&&(d=a.length-1);var e,f=G+2*y;for(e=0;eMath.abs(g-k)?[new D(a,1-c),new D(h, +1-d),new D(m,1-e),new D(q,1-b)]:[new D(g,1-c),new D(k,1-d),new D(l,1-e),new D(n,1-b)]}};Oc.prototype=Object.create(M.prototype);Oc.prototype.constructor=Oc;Wb.prototype=Object.create(Fa.prototype);Wb.prototype.constructor=Wb;Pc.prototype=Object.create(M.prototype);Pc.prototype.constructor=Pc;nb.prototype=Object.create(I.prototype);nb.prototype.constructor=nb;Qc.prototype=Object.create(M.prototype);Qc.prototype.constructor=Qc;Xb.prototype=Object.create(I.prototype);Xb.prototype.constructor=Xb;Rc.prototype= +Object.create(M.prototype);Rc.prototype.constructor=Rc;Yb.prototype=Object.create(I.prototype);Yb.prototype.constructor=Yb;Zb.prototype=Object.create(M.prototype);Zb.prototype.constructor=Zb;$b.prototype=Object.create(I.prototype);$b.prototype.constructor=$b;ac.prototype=Object.create(I.prototype);ac.prototype.constructor=ac;ob.prototype=Object.create(M.prototype);ob.prototype.constructor=ob;Wa.prototype=Object.create(I.prototype);Wa.prototype.constructor=Wa;Sc.prototype=Object.create(ob.prototype); +Sc.prototype.constructor=Sc;Tc.prototype=Object.create(Wa.prototype);Tc.prototype.constructor=Tc;Uc.prototype=Object.create(M.prototype);Uc.prototype.constructor=Uc;bc.prototype=Object.create(I.prototype);bc.prototype.constructor=bc;var Ma=Object.freeze({WireframeGeometry:Ob,ParametricGeometry:Fc,ParametricBufferGeometry:Pb,TetrahedronGeometry:Hc,TetrahedronBufferGeometry:Qb,OctahedronGeometry:Ic,OctahedronBufferGeometry:mb,IcosahedronGeometry:Jc,IcosahedronBufferGeometry:Rb,DodecahedronGeometry:Kc, +DodecahedronBufferGeometry:Sb,PolyhedronGeometry:Gc,PolyhedronBufferGeometry:ia,TubeGeometry:Lc,TubeBufferGeometry:Tb,TorusKnotGeometry:Mc,TorusKnotBufferGeometry:Ub,TorusGeometry:Nc,TorusBufferGeometry:Vb,TextGeometry:Oc,TextBufferGeometry:Wb,SphereGeometry:Pc,SphereBufferGeometry:nb,RingGeometry:Qc,RingBufferGeometry:Xb,PlaneGeometry:xc,PlaneBufferGeometry:lb,LatheGeometry:Rc,LatheBufferGeometry:Yb,ShapeGeometry:Zb,ShapeBufferGeometry:$b,ExtrudeGeometry:db,ExtrudeBufferGeometry:Fa,EdgesGeometry:ac, +ConeGeometry:Sc,ConeBufferGeometry:Tc,CylinderGeometry:ob,CylinderBufferGeometry:Wa,CircleGeometry:Uc,CircleBufferGeometry:bc,BoxGeometry:Ib,BoxBufferGeometry:kb});cc.prototype=Object.create(Ea.prototype);cc.prototype.constructor=cc;cc.prototype.isShadowMaterial=!0;dc.prototype=Object.create(Ea.prototype);dc.prototype.constructor=dc;dc.prototype.isRawShaderMaterial=!0;Ra.prototype=Object.create(Z.prototype);Ra.prototype.constructor=Ra;Ra.prototype.isMeshStandardMaterial=!0;Ra.prototype.copy=function(a){Z.prototype.copy.call(this, +a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap; +this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals= +a.morphNormals;return this};pb.prototype=Object.create(Ra.prototype);pb.prototype.constructor=pb;pb.prototype.isMeshPhysicalMaterial=!0;pb.prototype.copy=function(a){Ra.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};ta.prototype=Object.create(Z.prototype);ta.prototype.constructor=ta;ta.prototype.isMeshPhongMaterial=!0;ta.prototype.copy=function(a){Z.prototype.copy.call(this, +a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale= +a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};qb.prototype= +Object.create(ta.prototype);qb.prototype.constructor=qb;qb.prototype.isMeshToonMaterial=!0;qb.prototype.copy=function(a){ta.prototype.copy.call(this,a);this.gradientMap=a.gradientMap;return this};rb.prototype=Object.create(Z.prototype);rb.prototype.constructor=rb;rb.prototype.isMeshNormalMaterial=!0;rb.prototype.copy=function(a){Z.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap; +this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};sb.prototype=Object.create(Z.prototype);sb.prototype.constructor=sb;sb.prototype.isMeshLambertMaterial=!0;sb.prototype.copy=function(a){Z.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity= +a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin; +this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};tb.prototype=Object.create(Z.prototype);tb.prototype.constructor=tb;tb.prototype.isLineDashedMaterial=!0;tb.prototype.copy=function(a){Z.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var lg=Object.freeze({ShadowMaterial:cc,SpriteMaterial:cb,RawShaderMaterial:dc,ShaderMaterial:Ea,PointsMaterial:La, +MeshPhysicalMaterial:pb,MeshStandardMaterial:Ra,MeshPhongMaterial:ta,MeshToonMaterial:qb,MeshNormalMaterial:rb,MeshLambertMaterial:sb,MeshDepthMaterial:$a,MeshBasicMaterial:Na,LineDashedMaterial:tb,LineBasicMaterial:ha,Material:Z}),hd={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},Aa=new Zd;Object.assign(ua.prototype,{load:function(a,b, +c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);var e=this,f=hd.get(a);if(void 0!==f)return e.manager.itemStart(a),setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){var h=g[1],k=!!g[2],g=g[3],g=window.decodeURIComponent(g);k&&(g=window.atob(g));try{var m,l=(this.responseType||"").toLowerCase();switch(l){case "arraybuffer":case "blob":m=new ArrayBuffer(g.length);for(var q=new Uint8Array(m),k=0;k=e)break a;else{f=b[1];a=e)break b}d=c;c=0}}for(;c>>1,ab;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),d=this.getValueSize(),this.times=va.arraySlice(c,e,f),this.values=va.arraySlice(this.values,e*d,f*d);return this},validate:function(){var a=!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("invalid value size in track",this),a=!1);var c=this.times,b=this.values,d=c.length;0===d&&(console.error("track is empty", +this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("time is not a valid number",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("out of order keys",this,f,g,e);a=!1;break}e=g}if(void 0!==b&&va.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("value is not a valid number",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1, +f=a.length-1,g=1;gm.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});Object.assign(ce.prototype, +{load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===typeof this.texturePath?this.texturePath:gc.prototype.extractUrlBase(a),g=new ua(this.manager);g.setResponseType("json");g.setWithCredentials(this.withCredentials);g.load(a,function(c){var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d)){if("object"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}if("scene"===d.toLowerCase()){console.error("THREE.JSONLoader: "+a+ +" should be loaded with THREE.SceneLoader instead.");return}}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setTexturePath:function(a){this.texturePath=a},parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new M,d=a,e,f,g,h,k,m,l,q,n,r,z,t,y,x,v=d.faces;n=d.vertices;var G=d.normals,w=d.colors;m=d.scale;var B=0;if(void 0!==d.uvs){for(e=0;ef;f++)q=v[h++],x=y[2*q],q=y[2*q+1],x=new D(x,q),2!==f&&c.faceVertexUvs[e][g].push(x),0!==f&&c.faceVertexUvs[e][g+ +1].push(x);l&&(l=3*v[h++],r.normal.set(G[l++],G[l++],G[l]),t.normal.copy(r.normal));if(z)for(e=0;4>e;e++)l=3*v[h++],z=new p(G[l++],G[l++],G[l]),2!==e&&r.vertexNormals.push(z),0!==e&&t.vertexNormals.push(z);m&&(m=v[h++],m=w[m],r.color.setHex(m),t.color.setHex(m));if(n)for(e=0;4>e;e++)m=v[h++],m=w[m],2!==e&&r.vertexColors.push(new H(m)),0!==e&&t.vertexColors.push(new H(m));c.faces.push(r);c.faces.push(t)}else{r=new Va;r.a=v[h++];r.b=v[h++];r.c=v[h++];g&&(g=v[h++],r.materialIndex=g);g=c.faces.length; +if(e)for(e=0;ef;f++)q=v[h++],x=y[2*q],q=y[2*q+1],x=new D(x,q),c.faceVertexUvs[e][g].push(x);l&&(l=3*v[h++],r.normal.set(G[l++],G[l++],G[l]));if(z)for(e=0;3>e;e++)l=3*v[h++],z=new p(G[l++],G[l++],G[l]),r.vertexNormals.push(z);m&&(m=v[h++],r.color.setHex(w[m]));if(n)for(e=0;3>e;e++)m=v[h++],r.vertexColors.push(new H(w[m]));c.faces.push(r)}d=a;h=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(k=0,v=d.skinWeights.length;k< +v;k+=h)c.skinWeights.push(new ga(d.skinWeights[k],1k)g=d+1;else if(0b&&(b=0);1Number.EPSILON&&(g.normalize(),c=Math.acos(Y.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(Y.clamp(e[0].dot(e[a]),-1,1)),c/=a,0=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&& +this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;cc;)c+=b;for(;c>b;)c-=b;cb.length-2?b.length-1:a+1],b=b[a>b.length-3?b.length-1:a+2];return new D(Se(c,d.x,e.x,f.x,b.x),Se(c,d.y,e.y,f.y,b.y))};hc.prototype=Object.create(na.prototype);hc.prototype.constructor=hc;hc.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new D(yb(a,b.x,c.x, +d.x,e.x),yb(a,b.y,c.y,d.y,e.y))};ic.prototype=Object.create(na.prototype);ic.prototype.constructor=ic;ic.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new D(xb(a,b.x,c.x,d.x),xb(a,b.y,c.y,d.y))};var ue=Object.assign(Object.create(Yc.prototype),{fromPoints:function(a){this.moveTo(a[0].x,a[0].y);for(var b=1,c=a.length;bNumber.EPSILON){if(0>l&&(g=b[f],k=-k, +h=b[e],l=-l),!(a.yh.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=l*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=za.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);var g,h,k,l=[];if(1===f.length)return h=f[0],k=new Ab,k.curves=h.curves,l.push(k),l;var p=!e(f[0].getPoints()),p=a?!p:p;k=[];var q=[],n=[],r=0,z;q[r]=void 0;n[r]=[];for(var t=0,y=f.length;td&&this._mixBufferRegion(c,a,3*b,1-d,b);for(var d=b,f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d= +0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){qa.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(Ve.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_, +c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(oa,{Composite:Ve,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new oa.Composite(a,b,c):new oa(a,b,c)},parseTrackName:function(){var a=new RegExp("^"+/((?:[\w-]+[\/:])*)/.source+/([\w-\.]+)?/.source+/(?:\.([\w-]+)(?:\[(.+)\])?)?/.source+/\.([\w-]+)(?:\[(.+)\])?/.source+"$"),b=["material","materials","bones"];return function(c){var d= +a.exec(c);if(!d)throw Error("PropertyBinding: Cannot parse trackName: "+c);var d={nodeName:d[2],objectName:d[3],objectIndex:d[4],propertyName:d[5],propertyIndex:d[6]},e=d.nodeName&&d.nodeName.lastIndexOf(".");if(void 0!==e&&-1!==e){var f=d.nodeName.substring(e+1);-1!==b.indexOf(f)&&(d.nodeName=d.nodeName.substring(0,e),d.objectName=f)}if(null===d.propertyName||0===d.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+c);return d}}(),findNode:function(a,b){if(!b|| +""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;if(a.skeleton){var c=function(a){for(var c=0;c=c){var q=c++,n=b[q];d[n.uuid]=p;b[p]=n;d[l]=q;b[q]=k;k=0;for(l=f;k!==l;++k){var n=e[k],r=n[p];n[p]=n[q];n[q]=r}}}this.nCachedObjects_=c},uncache:function(a){for(var b=this._objects,c=b.length,d=this.nCachedObjects_,e=this._indicesByUUID,f=this._bindings,g=f.length,h=0,k=arguments.length;h!==k;++h){var l=arguments[h].uuid,p=e[l];if(void 0!== +p)if(delete e[l],pb||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){var b=this.timeScale,c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0],b=b*d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a;if(0===a)return b;var c=this._clip.duration,d=this.loop,e=this._loopCount;if(2200=== +d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{d=2202===d;-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,d)):this._setEndings(0===this.repetitions,!0,d));if(b>=c||0>b){var f=Math.floor(b/c),b=b-c*f,e=e+Math.abs(f),g=this.repetitions-e;0>g?(this.clampWhenFinished?this.paused=!0:this.enabled=!1,b=0a,this._setEndings(a,!a,d)):this._setEndings(!1,!1,d),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:f}))}if(d&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:2400:2402)},_scheduleFading:function(a, +b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});Object.assign(Ye.prototype,sa.prototype,{_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings,g=a._interpolants,h=c.uuid,k=this._bindingsByRootAndName,l=k[h];void 0===l&&(l={},k[h]=l);for(k=0;k!==e;++k){var p=d[k],q=p.name,n=l[q];if(void 0=== +n){n=f[k];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,h,q));continue}n=new le(oa.create(c,q,b&&b._propertyBindings[k].binding.parsedPath),p.ValueTypeName,p.getValueSize());++n.referenceCount;this._addInactiveBinding(n,h,q)}f[k]=n;g[k].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a, +c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings= +0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&ah.end&&(h.end=f);c||(c=k)}}for(k in d)h=d[k],this.createAnimation(k,h.start,h.end,a);this.firstAnimation=c};ra.prototype.setAnimationDirectionForward=function(a){if(a=this.animationsMap[a])a.direction=1,a.directionBackwards=!1};ra.prototype.setAnimationDirectionBackward=function(a){if(a=this.animationsMap[a])a.direction=-1,a.directionBackwards=!0};ra.prototype.setAnimationFPS= +function(a,b){var c=this.animationsMap[a];c&&(c.fps=b,c.duration=(c.end-c.start)/c.fps)};ra.prototype.setAnimationDuration=function(a,b){var c=this.animationsMap[a];c&&(c.duration=b,c.fps=(c.end-c.start)/c.duration)};ra.prototype.setAnimationWeight=function(a,b){var c=this.animationsMap[a];c&&(c.weight=b)};ra.prototype.setAnimationTime=function(a,b){var c=this.animationsMap[a];c&&(c.time=b)};ra.prototype.getAnimationTime=function(a){var b=0;if(a=this.animationsMap[a])b=a.time;return b};ra.prototype.getAnimationDuration= +function(a){var b=-1;if(a=this.animationsMap[a])b=a.duration;return b};ra.prototype.playAnimation=function(a){var b=this.animationsMap[a];b?(b.time=0,b.active=!0):console.warn("THREE.MorphBlendMesh: animation["+a+"] undefined in .playAnimation()")};ra.prototype.stopAnimation=function(a){if(a=this.animationsMap[a])a.active=!1};ra.prototype.update=function(a){for(var b=0,c=this.animationsList.length;b +d.duration||0>d.time)d.direction*=-1,d.time>d.duration&&(d.time=d.duration,d.directionBackwards=!0),0>d.time&&(d.time=0,d.directionBackwards=!1)}else d.time%=d.duration,0>d.time&&(d.time+=d.duration);var f=d.start+Y.clamp(Math.floor(d.time/e),0,d.length-1),g=d.weight;f!==d.currentFrame&&(this.morphTargetInfluences[d.lastFrame]=0,this.morphTargetInfluences[d.currentFrame]=1*g,this.morphTargetInfluences[f]=0,d.lastFrame=d.currentFrame,d.currentFrame=f);e=d.time%e/e;d.directionBackwards&&(e=1-e);d.currentFrame!== +d.lastFrame?(this.morphTargetInfluences[d.currentFrame]=e*g,this.morphTargetInfluences[d.lastFrame]=(1-e)*g):this.morphTargetInfluences[d.currentFrame]=g}}};$c.prototype=Object.create(B.prototype);$c.prototype.constructor=$c;$c.prototype.isImmediateRenderObject=!0;ad.prototype=Object.create(da.prototype);ad.prototype.constructor=ad;ad.prototype.update=function(){var a=new p,b=new p,c=new Ka;return function(){var d=["a","b","c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld); +var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices,k=g.faces,l=g=0,p=k.length;lc.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Cb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Cb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)}; +Md.prototype=Object.create(da.prototype);Md.prototype.constructor=Md;var Pd=new p,ve=new se,we=new se,xe=new se;Ja.prototype=Object.create(na.prototype);Ja.prototype.constructor=Ja;Ja.prototype.getPoint=function(a){var b=this.points,c=b.length;2>c&&console.log("duh, you need at least 2 points");a*=c-(this.closed?0:1);var d=Math.floor(a);a-=d;this.closed?d+=0d&&(d=1);1E-4>c&&(c=d);1E-4>h&&(h=d);ve.initNonuniformCatmullRom(e.x,f.x,g.x,b.x,c,d,h);we.initNonuniformCatmullRom(e.y,f.y,g.y,b.y,c,d,h);xe.initNonuniformCatmullRom(e.z, +f.z,g.z,b.z,c,d,h)}else"catmullrom"===this.type&&(c=void 0!==this.tension?this.tension:.5,ve.initCatmullRom(e.x,f.x,g.x,b.x,c),we.initCatmullRom(e.y,f.y,g.y,b.y,c),xe.initCatmullRom(e.z,f.z,g.z,b.z,c));return new p(ve.calc(a),we.calc(a),xe.calc(a))};ed.prototype=Object.create(na.prototype);ed.prototype.constructor=ed;ed.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2,e=this.v3;return new p(yb(a,b.x,c.x,d.x,e.x),yb(a,b.y,c.y,d.y,e.y),yb(a,b.z,c.z,d.z,e.z))};fd.prototype=Object.create(na.prototype); +fd.prototype.constructor=fd;fd.prototype.getPoint=function(a){var b=this.v0,c=this.v1,d=this.v2;return new p(xb(a,b.x,c.x,d.x),xb(a,b.y,c.y,d.y),xb(a,b.z,c.z,d.z))};gd.prototype=Object.create(na.prototype);gd.prototype.constructor=gd;gd.prototype.getPoint=function(a){if(1===a)return this.v2.clone();var b=new p;b.subVectors(this.v2,this.v1);b.multiplyScalar(a);b.add(this.v1);return b};Nd.prototype=Object.create(Xa.prototype);Nd.prototype.constructor=Nd;na.create=function(a,b){console.log("THREE.Curve.create() has been deprecated"); +a.prototype=Object.create(na.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};df.prototype=Object.create(Ja.prototype);ef.prototype=Object.create(Ja.prototype);te.prototype=Object.create(Ja.prototype);Object.assign(te.prototype,{initFromArray:function(a){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(a){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(a){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}}); +bd.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};Object.assign(id.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox()."); +return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Ta.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."); +return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}});Hb.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");return this.getCenter(a)};Y.random16=function(){console.warn("THREE.Math.random16() has been deprecated. Use Math.random() instead."); +return Math.random()};Object.assign(Ka.prototype,{flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."); +return this.applyToVector3Array(a)},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},applyToVector3Array:function(a,b,c){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});Object.assign(J.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)}, +flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){var a;return function(){void 0===a&&(a=new p);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."); +return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(a){console.warn("THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead."); +return this.applyToVector3Array(a)},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")}, +rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(a,b,c){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");return this.applyToBufferAttribute(a)},applyToVector3Array:function(a,b,c){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")}, +makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});wa.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};qa.prototype.multiplyVector3=function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."); +return a.applyQuaternion(this)};Object.assign(hb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)}}); +Object.assign(Ab.prototype,{extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new db(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new Zb(this,a)}});Object.assign(D.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});Object.assign(p.prototype, +{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."); +return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,b,c){console.error("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a, +b,c)}});Object.assign(ga.prototype,{fromAttribute:function(a,b,c){console.error("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)}});M.prototype.computeTangents=function(){console.warn("THREE.Geometry: .computeTangents() has been removed.")};Object.assign(B.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")}, +translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)}});Object.defineProperties(B.prototype,{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}, +set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});Object.defineProperties(Bc.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Object.defineProperty(Cc.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}}); +Object.defineProperty(na.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});xa.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)}; +Object.defineProperties(ma.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."); +this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."); +this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."); +this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(L.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");return this.array.length}}});Object.assign(I.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a, +b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}}); +Object.defineProperties(I.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");return this.groups}}});Object.defineProperties(Jd.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead."); +return this}}});Object.defineProperties(Z.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new H}}});Object.defineProperties(ta.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}}); +Object.defineProperties(Ea.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(Xd.prototype,{getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");return this.getRenderTarget()}, +supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."); +return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")}, +supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."); +return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")}}); +Object.defineProperties(Xd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){return this.shadowMap.cullFace},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace."); +this.shadowMap.cullFace=a}}});Object.defineProperties(Je.prototype,{cullFace:{get:function(){return this.renderReverseSided?2:1},set:function(a){a=1!==a;console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+a+".");this.renderReverseSided=a}}});Object.defineProperties(Db.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."); +this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter= +a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy= +a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."); +return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps}, +set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});jc.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new fe).load(a,function(a){b.setBuffer(a)});return this};ke.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");return this.getFrequencyData()};l.WebGLRenderTargetCube=Eb;l.WebGLRenderTarget= +Db;l.WebGLRenderer=Xd;l.ShaderLib=ab;l.UniformsLib=V;l.UniformsUtils=Ha;l.ShaderChunk=U;l.FogExp2=Kb;l.Fog=Lb;l.Scene=md;l.LensFlare=Yd;l.Sprite=Ac;l.LOD=Bc;l.SkinnedMesh=od;l.Skeleton=Cc;l.Bone=nd;l.Mesh=Ca;l.LineSegments=da;l.LineLoop=pd;l.Line=ya;l.Points=Mb;l.Group=Dc;l.VideoTexture=qd;l.DataTexture=eb;l.CompressedTexture=Nb;l.CubeTexture=Za;l.CanvasTexture=rd;l.DepthTexture=Ec;l.Texture=X;l.CompressedTextureLoader=Qe;l.DataTextureLoader=$d;l.CubeTextureLoader=ae;l.TextureLoader=sd;l.ObjectLoader= +Re;l.MaterialLoader=Hd;l.BufferGeometryLoader=be;l.DefaultLoadingManager=Aa;l.LoadingManager=Zd;l.JSONLoader=ce;l.ImageLoader=Vc;l.FontLoader=Te;l.FileLoader=ua;l.Loader=gc;l.Cache=hd;l.AudioLoader=fe;l.SpotLightShadow=ud;l.SpotLight=vd;l.PointLight=wd;l.RectAreaLight=Ad;l.HemisphereLight=td;l.DirectionalLightShadow=xd;l.DirectionalLight=yd;l.AmbientLight=zd;l.LightShadow=ub;l.Light=ma;l.StereoCamera=Ue;l.PerspectiveCamera=xa;l.OrthographicCamera=Jb;l.CubeCamera=Id;l.ArrayCamera=ge;l.Camera=Oa;l.AudioListener= +he;l.PositionalAudio=je;l.AudioContext=ie;l.AudioAnalyser=ke;l.Audio=jc;l.VectorKeyframeTrack=ec;l.StringKeyframeTrack=Ed;l.QuaternionKeyframeTrack=Xc;l.NumberKeyframeTrack=fc;l.ColorKeyframeTrack=Gd;l.BooleanKeyframeTrack=Fd;l.PropertyMixer=le;l.PropertyBinding=oa;l.KeyframeTrack=wb;l.AnimationUtils=va;l.AnimationObjectGroup=We;l.AnimationMixer=Ye;l.AnimationClip=Ba;l.Uniform=Jd;l.InstancedBufferGeometry=me;l.BufferGeometry=I;l.GeometryIdCount=function(){return Td++};l.Geometry=M;l.InterleavedBufferAttribute= +ne;l.InstancedInterleavedBuffer=oe;l.InterleavedBuffer=kc;l.InstancedBufferAttribute=pe;l.Face3=Va;l.Object3D=B;l.Raycaster=Ze;l.Layers=Rd;l.EventDispatcher=sa;l.Clock=af;l.QuaternionLinearInterpolant=Dd;l.LinearInterpolant=Wc;l.DiscreteInterpolant=Cd;l.CubicInterpolant=Bd;l.Interpolant=Da;l.Triangle=Ua;l.Math=Y;l.Spherical=bf;l.Cylindrical=cf;l.Plane=wa;l.Frustum=jd;l.Sphere=Ga;l.Ray=hb;l.Matrix4=J;l.Matrix3=Ka;l.Box3=Ta;l.Box2=id;l.Line3=Hb;l.Euler=bb;l.Vector4=ga;l.Vector3=p;l.Vector2=D;l.Quaternion= +qa;l.Color=H;l.MorphBlendMesh=ra;l.ImmediateRenderObject=$c;l.VertexNormalsHelper=ad;l.SpotLightHelper=lc;l.SkeletonHelper=mc;l.PointLightHelper=nc;l.RectAreaLightHelper=oc;l.HemisphereLightHelper=pc;l.GridHelper=bd;l.PolarGridHelper=Kd;l.FaceNormalsHelper=cd;l.DirectionalLightHelper=qc;l.CameraHelper=dd;l.BoxHelper=Bb;l.ArrowHelper=Cb;l.AxisHelper=Md;l.CatmullRomCurve3=Ja;l.CubicBezierCurve3=ed;l.QuadraticBezierCurve3=fd;l.LineCurve3=gd;l.ArcCurve=Nd;l.EllipseCurve=Xa;l.SplineCurve=zb;l.CubicBezierCurve= +hc;l.QuadraticBezierCurve=ic;l.LineCurve=Sa;l.Shape=Ab;l.Path=Zc;l.ShapePath=de;l.Font=ee;l.CurvePath=Yc;l.Curve=na;l.ShapeUtils=za;l.SceneUtils={createMultiMaterialObject:function(a,b){for(var c=new Dc,d=0,e=b.length;d0&&(n+=", "),n+="rgba("+(r=o[s]).r+", "+r.g+", "+r.b+", "+r.a+") "+r.position+"%";return t+i+n+")"},sanitizeHex:function(e){if(3===(e=e.replace("#","").trim()).length){var r=e.charAt(0),a=e.charAt(1),t=e.charAt(2);e=r+r+a+a+t+t}return"#"+e},sanitizeGradient:function(e){for(var r,a=e.colors,t=a.length,i=[],o=0;o';return a||(v+=''),v+="",n=e(v),c&&n.data("gradient",c),n[0]}return n=document.createElement("span"),n.className="rev-cpicker-color blank",n}function l(){var r=c(this,"data-color").toLowerCase(),a=!kr&&r===pr.toLowerCase();if(r===ir||a){var t=e(this);return t.closest(".rev-cpicker-presets-group").find(".rev-cpicker-color.selected").removeClass("selected"),Cr=t,kr&&!De&&d(Cr.data("gradient"),!0),Cr.addClass("selected"),!1}}function p(e,r){for(var a=document.createDocumentFragment(),t=-1!==e.search("core"),i=t?"":" rev-picker-color-custom",o=r.length,c=-1!==e.search("colors")?Ar:Mr,n=Math.max(Math.ceil(o/Hr),c),l=0;lr)return a}function b(r,a){var t=g(r,a).color,i=u(t,r,!0),o=h(r,a,f(t,!0),i);xe&&xe.removeClass("active"),xe=e(o).addClass("active").appendTo(Ze).draggable(Er),He=xe.children(".rev-cpicker-point-square")[0],Se=xe.children(".rev-cpicker-point-triangle")[0],Ue=Ze.children();var c=k(a);N(o),"bottom"===r&&he.val(c[1]).change()}function k(e){void 0===e&&(e=ee[Je].x);var r=xe.attr("data-color"),a=xe.hasClass("rev-cpicker-point-bottom");if(a)hr.hasClass("active")&&(Qe.attr("disabled","disabled"),Ye.attr("disabled","disabled"),hr.removeClass("active")),r=RevColor.rgbaToHex(r)[0],ke.css("background",r),me.removeAttr("disabled").val(e+"%"),ce.find(".rev-cpicker-point-bottom").length>2&&er.addClass("active"),ce.addClass("open");else{er.hasClass("active")&&(ke.css("background",""),me.attr("disabled","disabled"),er.removeClass("active"));var t=RevColor.getOpacity(r);Qe.attr("data-opacity",t).val(t).removeAttr("disabled"),Ye.val(e+"%").removeAttr("disabled"),ce.find(".rev-cpicker-point-top").length>2&&hr.addClass("active"),ce.removeClass("open")}return[a,r]}function u(e,r,a){return"bottom"===r?"rgb("+e.r+","+e.g+","+e.b+")":"rgba(0, 0, 0, "+(a?"1":e.a)+")"}function f(e,r){var a=r?"1":e.a;return"rgba("+e.r+","+e.g+","+e.b+","+a+")"}function m(e){for(var r,a,t=document.createDocumentFragment(),i=e.length,o=0;o':'',o}function C(e){return e&&"radial"!==e||(e="0"),Ae.innerHTML=e+"°",Ae.value}function x(){xe&&(xe.removeClass("active"),xe=!1),me.attr("disabled","disabled"),Qe.attr("disabled","disabled"),Ye.attr("disabled","disabled"),hr.removeClass("active"),er.removeClass("active"),ke.css("background",""),ce.removeClass("open")}function y(e,r){ce.removeClass("active is-basic").hide(),Z.removeClass("rev-colorpicker-open"),mr.css({left:"",top:""}),ye&&(ye.remove(),ye=!1),Cr?(Cr.hasClass("selected")?(r&&or.data("hex",Cr.attr("data-color").toLowerCase()),Cr.removeClass("selected")):or.removeData("hex"),Cr=!1):or.removeData("hex"),r||(Re&&Re(),lr&&"transparent"!==lr?dr[0].style.background=lr:dr.css("background",""),X.trigger("revcolorpickerupdate",[or,lr])),dr=!1,or=!1}function w(){var r=e(this).children(".rev-cpicker-color").not(".blank").length;return r>Hr?e("#"+this.id+"-btn").addClass("multiplerows"):e("#"+this.id+"-btn").removeClass("multiplerows"),r}function R(){var r,a=e(this),t=-1!==this.id.search("colors")?Ar:Mr,i=a.children(".rev-cpicker-color"),o=i.length,c=Math.ceil(o/Hr),n=t*Hr;o+=1;for(var s=0;s=n&&(p.remove(),r=!0)}return r}function _(){if(-1===this.className.search("blank"))return Ce=!1,!1}function I(r){var a=r.angle;"radial"===r.type&&(a="radial"),$e.removeClass("selected"),e('.rev-cpicker-orientation[data-direction="'+a+'"]').addClass("selected"),Q.val(C(a)),O(a),m(r.colors)}function N(e,r,t){Oe=r,V(),Oe=!1;for(var i,o,c,n=[],s=ee.length,l=0;lr.x?1:0}function E(e){var r=RevColor.rgbValues(c(this,"data-color"),4),a=-1!==this.className.search("bottom")?"bottom":"top",t=r[3].replace(/\.?0*$/,"")||0,i=parseInt(this.style.left,10);Oe&&(i<50?i+=2*(50-i):i-=2*(i-50),this.style.left=i+"%",this.setAttribute("data-location",i)),ee[e]={el:this,x:i,alpha:t,align:a,color:{r:parseInt(r[0],10),g:parseInt(r[1],10),b:parseInt(r[2],10),a:t,position:i,align:a}},xe&&xe[0]!==this&&("bottom"===a?je[je.length]=i:Fe[Fe.length]=i)}function O(e){e=void 0!==e?e:parseInt(Q.val(),10),Be[0].style.transform="rotate("+e+"deg)"}function P(r,a,t){var i,o,c=void 0!==t,n=c?t:parseInt(Q.val(),10);if(r&&"keyup"===r.type)i=!isNaN(n)&&n>=-360&&n<=360,o=n;else{var s=parseInt(Q.data("orig-value"),10);n||(n="0"),(isNaN(n)||n<-360||n>360)&&(n=s),n!==s&&(o=n,i=!0,Q.val(C(n)),c||(n=a||n,$e.removeClass("selected"),e('.rev-cpicker-orientation[data-direction="'+n+'"]').addClass("selected")))}(i||a)&&(o&&O(o),N())}function z(){var r=e(this);-1!==this.className.search("down")?(r.parent().addClass("active"),r.closest(".rev-cpicker-presets").addClass("active"),e(this.id.replace("-btn","")).addClass("active"),ur=ce.hasClass("gradient-view")):(r.parent().removeClass("active"),r.closest(".rev-cpicker-presets").removeClass("active"),e(this.id.replace("-btn","")).removeClass("active"),ur=!1)}function D(e,r){var a=parseInt(100*(Math.round(r.position.left)/(Nr-2)).toFixed(2),10);"bottom"===Ne?me.val(a+"%").trigger("keyup"):Ye.val(a+"%").trigger("keyup")}function L(){var r=e(this);Ne=r.hasClass("rev-cpicker-point-bottom")?"bottom":"top",r.click()}function B(){"bottom"===Ne?me.trigger("focusout"):Ye.trigger("focusout")}function G(e){yr=!0,xr.slider("value",Math.round(.01*e*Tr)),yr=!1}function q(e){var r=Le.offset(),a=e.pageX-r.left,t=e.pageY-r.top;if(!isNaN(a)&&!isNaN(t)){var i=Math.atan2(t-jr,a-jr)*(180/Math.PI)+90;i<0&&(i+=360),i=Math.max(0,Math.min(360,Math.round(i))),i=5*Math.round(i/5),br=!0,P(!1,!1,i),br=!1}}function $(e){e.stopImmediatePropagation()}function J(){ne||e.tpColorPicker(),wr=document.getElementById("rev-cpicker-current-edit"),Ge=document.getElementById("rev-cpicker-gradient-output"),Ee=document.getElementById("rev-cpicker-gradient-input"),ze=document.getElementById("rev-cpicker-edit-title"),Ae=document.createElement("textarea"),hr=e("#rev-cpicker-opacity-delete"),Ze=e("#rev-cpciker-point-container"),Ye=e("#rev-cpicker-opacity-location"),cr=e(".rev-cpicker-presets-group"),sr=e("#rev-cpicker-color-opacity"),re=e("#rev-cpicker-orientation-radial"),er=e("#rev-cpicker-color-delete"),Qe=e("#rev-cpicker-grad-opacity"),me=e("#rev-cpicker-color-location"),we=e("#rev-cpicker-gradients-core"),$e=e(".rev-cpicker-orientation"),he=e("#rev-cpicker-iris-gradient"),Be=e("#rev-cpicker-wheel-point"),Ke=e("#rev-cpicker-gradients"),Ve=e("#rev-cpicker-iris-color"),le=e("#rev-cpicker-gradient-btn"),pe=e("#rev-cpicker-gradient-hex"),qe=e("#rev-cpciker-clear-hex"),se=e("#rev-cpicker-meta-reverse"),Me=e("#rev-cpicker-hit-bottom"),xr=e("#rev-cpicker-scroll"),nr=e("#rev-cpicker-colors"),fe=e("#rev-cpicker-color-hex"),ue=e("#rev-cpicker-color-btn"),ke=e("#rev-cpicker-color-box"),Q=e("#rev-cpicker-meta-angle"),Le=e("#rev-cpicker-wheel"),ae=e("#rev-cpicker-hit-top"),mr=e("#rev-cpicker"),X=e(document),Er.drag=D,Er.stop=B,Er.start=L,ue.data("state",nr.find(".rev-cpicker-color").eq(0).attr("data-color")||"#ffffff"),le.data("state",Ke.find(".rev-cpicker-color").eq(0).attr("data-color")||"linear-gradient(0deg, rgba(255, 255, 255, 1) 0%, rgba(0, 0, 0, 1) 100%)"),mr.draggable({containment:"window",handle:".rev-cpicker-draggable",stop:function(){mr.css("height","auto")}}),cr.perfectScrollbar({wheelPropagation:!1,suppressScrollX:!0}),Le.on("mousedown.revcpicker",function(e){$e.removeClass("selected"),Pe=!0,q(e)}).on("mousemove.revcpicker",function(e){Pe&&q(e)}).on("mouseleave.revcpicker mouseup.revcpicker",function(){Pe=!1}),e(".rev-cpicker-main-btn").on("click.revcpicker",function(){var r;if(De=-1===this.id.search("gradient"),dr&&(r=e(this).data("state")),De?(dr&&(ir=fe.val()),ce.removeClass("gradient-view").addClass("color-view")):(dr&&(ir=r),ce.removeClass("color-view").addClass("gradient-view"),We||we.children(".rev-cpicker-color").not(".blank").eq(0).click()),cr.perfectScrollbar("update"),r){var a="transparent"===r,t=a?"":r;a?dr.css("background",t):dr[0].style.background=t,kr=!0,e(".rev-cpicker-color").not(".blank").each(l),kr=!1,X.trigger("revcolorpickerupdate",[or,r])}}),e("#rev-cpicker-check").on("click.revcipicker",function(){var r,a,t;if(ce.hasClass("color-view")){var i=fe.val(),o=sr.val();or.removeData("gradient"),a="transparent"===i?"transparent":"100%"===o?RevColor.sanitizeHex(i):RevColor.processRgba(i,o),r=[or,a,!1]}else{x();var c=N(!1,!1,!0),n=e.extend({},c[0]),s=c[1];or.data("gradient",s),a=JSON.stringify(n).replace(/\"/g,"&"),r=[or,s,n]}(t=r[1]!==lr)&&(or.attr("data-color",r[1]).val(a).change(),X.trigger("revcolorpicker",r),_r&&_r(r[0],r[1],r[2])),y(!1,t)}),ce.on("click.revcpicker",function(r){if(ce.hasClass("open")){var a=r.target,t=e(a),i=a.id,o=-1!==a.className.search("rev-cpicker-point")||"rev-cpicker-section-right"===i||-1!==i.search("hit")||t.closest("#rev-cpicker-section-right, #rev-cpicker-point-wrap").length;o&&("text"===t.attr("type")?o=!t.attr("disabled"):"rev-cpicker-check-gradient"===i&&(o=!1)),o||x()}else Xe&&!1===/wheel|angle|reverse/.test(r.target.id)&&(-1===r.target.id.search("radial")&&e('.rev-cpicker-orientation[data-direction="'+parseInt(Q.val())+'"]').addClass("selected"),Le.removeClass("active"),Xe=!1)}),e(".rev-cpicker-close").on("click.revcpicker",y),Ve.wpColorPicker({palettes:!1,width:267,border:!1,hide:!1,change:function(e,r){var a=r.color.toString();if(this.value=a,fe.val(a),!gr){var t=sr.val();0===parseInt(t,10)&&(a="transparent"),v(!1,a,t),Cr&&(Cr.removeClass("selected"),Cr=!1)}}}),he.wpColorPicker({palettes:!1,height:250,border:!1,hide:!1,change:function(e,r){var a=r.color.toString();this.value=a,pe.val(a),ke.css("background",a),He.style.backgroundColor=a,Se.style.borderBottomColor=a;var t=RevColor.processRgba(a,100),i=RevColor.rgbValues(t,4),o=Ir.colors[Je];o.r=i[0],o.g=i[1],o.b=i[2],o.a=i[3],xe.attr("data-color",t),N()}}),xr.slider({orientation:"vertical",max:Tr,value:Tr,start:function(){fr="transparent"===fe.val()},slide:function(e,r){if(!yr){var a,t=parseInt(100*(r.value/Tr).toFixed(2),10);fr&&(a=t?"#ffffff":"transparent",fe.val(a)),0===t&&(a="transparent"),v(!1,a,t||"transparent"),sr.val(t+"%")}}}),e(".rev-cpicker-point-location").on("keyup.revcpicker focusout.revcpicker",function(e){if(xe){var r,a=xe.hasClass("rev-cpicker-point-bottom")?"bottom":"top",t="bottom"===a?je:Fe,i="bottom"===a?me:Ye,o=i.val().replace("%","")||"0",c=e.type;for(isNaN(o)&&(o="keyup"===c?"0":xe.attr("data-location")),r=(o=Math.max(0,Math.min(100,parseInt(o,10))))<50?1:-1;-1!==t.indexOf(o);)o+=r;"focusout"===c&&(i.val(o+"%"),xe.attr("data-location",o)),xe.css("left",o+"%"),N()}}).on("focusin.revcpicker",$),e("body").on("click.revcpicker",".rev-cpicker-point",function(){Ze.find(".rev-cpicker-point.active").removeClass("active"),xe=e(this).addClass("active"),He=xe.children(".rev-cpicker-point-square")[0],Se=xe.children(".rev-cpicker-point-triangle")[0],N(this),Cr=!1;var r=k();r[0]&&he.val(r[1]).change()}).on("mousedown.revcpicker",".rev-cpicker-point",function(r){xe=e(this).data("mousestart",r.pageY)}).on("mousemove.revcpicker",function(e){if(xe&&xe.data("mousestart")){var r=xe.data("mousestart"),a=e.pageY;xe.hasClass("rev-cpicker-point-bottom")?a>r&&a-r>Vr&&er.hasClass("active")?xe.addClass("warning"):xe.removeClass("warning"):r>a&&r-a>Vr&&hr.hasClass("active")?xe.addClass("warning"):xe.removeClass("warning")}}).on("mouseup.revcpicker",function(e){if(xe&&xe.data("mousestart")){var r=xe.data("mousestart"),a=e.pageY;xe.removeData("mousestart"),xe.hasClass("rev-cpicker-point-bottom")?a>r&&a-r>Sr&&er.hasClass("active")?er.click():xe.removeClass("warning"):r>a&&r-a>Sr&&hr.hasClass("active")?hr.click():xe.removeClass("warning")}}).on("change.revcpicker",".rev-cpicker-component",function(){var r=e(this),a=r.data("gradient")||r.val()||"transparent";("transparent"===a||RevColor.transparentRgba(a))&&(a=""),r.data("tpcp").css("background",a)}).on("keypress.revcpicker",function(e){if(ce.hasClass("active")){var r=e.which;27==r?y():13==r&&de&&de.blur()}}).on("click.revcpicker",".rev-cpicker-color:not(.blank)",function(){if(Cr){if(Cr[0]===this&&Cr.hasClass("selected"))return;Cr.removeClass("selected")}var r=(Cr=e(this)).parent()[0].id,a=-1!==r.search("core")?"core":"custom",t=-1!==r.search("colors")?"colors":"gradients",i=e("#rev-cpicker-"+t+"-"+a+"-btn");if(i.hasClass("active")&&i.find(".rev-cpicker-arrow-up").click(),ce.hasClass("color-view")){var o=Cr.attr("data-color");gr=!0,Ve.val(o).change(),"transparent"===fe.val()&&fe.val(o.toLowerCase()),gr=!1;var c=sr.val();0===parseInt(c,10)&&(o="transparent"),v(!1,o,c)}else ae.removeClass("full"),Me.removeClass("full"),d(Cr.data("gradient"),!0),se.removeClass("checked"),we.find(".rev-cpicker-color.selected").removeClass("selected");Cr.addClass("selected")}).on("mouseover.revcpicker",".rev-cpicker-color:not(.blank)",function(){ur&&(Ge.style.background=c(this,"data-color"))}).on("mouseout.revcpicker",".rev-cpicker-color:not(.blank)",function(){ur&&N()}).on("click.revcpicker",".rev-cpicker-delete",function(){if(oe){if(window.confirm(document.getElementById("rev-cpicker-remove-delete").innerHTML)){ce.addClass("onajax onajaxdelete");var r=e(this),a=r.parent(),t=a.attr("data-title")||"";if(!t)return void console.log("Preset does not have a name/title");var i=r.closest(".rev-cpicker-presets-group")[0].id,o=-1!==i.search("colors")?"colors":"gradients";X.off("revcpicker_onajax_delete.revcpicker").on("revcpicker_onajax_delete.revcpicker",function(t,o){o&&console.log(o);var c=r.closest(".rev-cpicker-presets-group"),n=c.find(".ps-scrollbar-x-rail"),s=e("#"+i+"-btn");a.remove(),R.call(c[0])?c.perfectScrollbar("update"):e('').insertBefore(n),w.call(c[0])').insertBefore(n),s.hasClass("active")&&s.children(".rev-cpicker-arrow-up").click()),ce.removeClass("onajax onajaxdelete")}),t=e.trim(t.replace(/\W+/g,"_")).replace(/^\_|\_$/g,"").toLowerCase(),oe("delete",t,o,"revcpicker_onajax_delete",or)}return!1}console.log("Ajax callback not defined")}),e(".rev-cpicker-save-preset-btn").on("click.revcpicker",function(){if(oe){var r,a,t=e(this),i=t.closest(".rev-cpicker-presets-save-as").find(".rev-cpicker-preset-save").val();if(i&&isNaN(i)){if(r=ce.hasClass("color-view")?"colors":"gradients",i=e.trim(i.replace(/\W+/g,"_")).replace(/^\_|\_$/g,"").toLowerCase(),e("#rev-cpicker-"+r+"-custom").find(".rev-cpicker-color").not(".blank").each(function(){if(e.trim(c(this,"data-title").replace(/\W+/g,"_")).replace(/^\_|\_$/g,"").toLowerCase()===i)return alert(t.attr("data-message")),a=!0,!1}),!a){ce.addClass("onajax onajaxsave");var o,n,l={};if("colors"===r){var p=fe.val(),v=sr.val();o="transparent"===p?"transparent":"100%"===v?RevColor.sanitizeHex(p):RevColor.processRgba(p,v)}else n=Ge.style.background,o=e.extend({},N(!1,!1,!0)[0]);l[i]=o,X.off("revcpicker_onajax_save.revcpicker").on("revcpicker_onajax_save.revcpicker",function(a,i){if(i)return ce.removeClass("onajax onajaxsave"),void alert(t.attr("data-message"));var o=e(s(l,!1," rev-picker-color-custom",n)),c=e("#rev-cpicker-"+r+"-custom"),p=c.find(".rev-cpicker-color.blank"),v=e("#"+c[0].id+"-btn");p.length?o.insertBefore(p.eq(0)):o.insertBefore(c.find(".ps-scrollbar-x-rail")),e("#rev-cpicker-"+r+"-custom-btn").click(),w.call(c[0])>6&&(p.length&&p.last().remove(),v.addClass("active").children(".rev-cpicker-arrow-down").click(),c.perfectScrollbar("update")),o.click(),ce.removeClass("onajax onajaxsave")}),oe("save",l,r,"revcpicker_onajax_save",or)}}else alert(t.attr("data-message"))}else console.log("Ajax callback not defined")}),e(".rev-cpicker-preset-title").on("click.revcpicker",function(){var r=e(this),a=r.parent(),t=r.hasClass("active")?"down":"up";z.call(r.find(".rev-cpicker-arrow-"+t)[0]),a.find(".rev-cpicker-preset-title").removeClass("selected"),r.addClass("selected"),a.find(".rev-cpicker-presets-group").hide(),document.getElementById(this.id.replace("-btn","")).style.display="block",cr.perfectScrollbar("update")}),qe.on("click.revcpicker",function(){sr.val("0%"),G(0),Ve.val(RevColor.defaultValue).change(),fe.val("transparent"),v(!1,"transparent")}),ce.find('input[type="text"]').on("focusin.revcpicker",function(){de=this}).on("focusout.revcpicker",function(){de=!1}),e(".rev-cpicker-input").on("focusin.revcpicker",function(){var r=e(this);r.data("orig-value",r.val())}),e(".rev-cpicker-hex").on("focusout.revcpicker",function(){var r,a,t;if("rev-cpicker-color-hex"===this.id){if(t=fe.val())if(t=RevColor.sanitizeHex(t),RevColor.isColor.test(t))fe.val(t);else{if(r=e(this),!(a=r.data("orig-value")))return void qe.click();t=a,fe.val(t)}else t="transparent";Ve.val(t).change()}else t=pe.val()||RevColor.defaultValue,t=RevColor.sanitizeHex(t),RevColor.isColor.test(t)||(t=(a=(r=e(this)).data("orig-value"))||RevColor.defaultValue),pe.val(t),he.val(t).change()}).on("focusin.revcpicker",$),e("#rev-cpciker-clear-gradient").on("click.revcpicker",function(){he.val(RevColor.defaultValue).change()}),Q.on("keyup.revcpicker focusout.revcpicker",P).on("focusin.revcpicker",function(){Xe=!0,Le.addClass("active")}).on("focusin.revcpicker",$),$e.on("click.revcpicker",function(){var r=e(this),a=r.attr("data-direction");$e.removeClass("selected"),r.addClass("selected"),"radial"!==a?Q.removeAttr("disabled").val(C(a)):Q.attr("disabled","disabled"),P(!1,a)}),e(".rev-cpicker-point-delete").on("click.revcpicker",function(){if(-1!==this.className.search("active")){var e=xe.hasClass("rev-cpicker-point-bottom")?"bottom":"top",r=ce.find(".rev-cpicker-point-"+e).length;r>2&&(xe.draggable("destroy").remove(),Ue=Ze.children(),ce.click(),N()),r<=Fr&&("bottom"===e?Me.removeClass("full"):ae.removeClass("full"))}}),e(".rev-cpicker-preset-save").on("focusin.revcpicker",$),e(".rev-cpicker-opacity-input").on("keyup.revcpicker focusout.revcpicker",function(r){var a,t=-1===this.id.search("grad"),i=t?sr:Qe,o=i.val().replace("%",""),c=r.type;if(isNaN(o)&&(o="keyup"===c?"0":e(this).data("orig-value")),o=Math.max(0,Math.min(100,o)),"focusout"===c&&(i.val(o+"%"),t||xe.attr("data-opacity",o)),t)v(!1,0===parseInt(o,10)&&"transparent",o),G(o);else{var n=RevColor.rgbValues(xe.attr("data-color"),3),s=Ir.colors[Je];o=(.01*parseInt(o,10)).toFixed(2).replace(/\.?0*$/,""),s.r=n[0],s.g=n[1],s.b=n[2],s.a=o,a=RevColor.rgbaString(s.r,s.g,s.b,o),xe.attr("data-color",a),N(),a="rgba(0, 0, 0, "+o+")",He.style.backgroundColor=a,Se.style.borderTopColor=a}}).on("focusin.revcpicker",$),e(".rev-cpicker-builder-hit").on("click.revcpicker",function(e){ee||V();for(var r=parseInt(100*((e.pageX-ae.offset().left)/Nr).toFixed(2),10),a=-1!==this.id.search("bottom")?"bottom":"top",t="bottom"===a?je:Fe,i=r<50?1:-1;-1!==t.indexOf(r);)r+=i;"bottom"===a?ce.find(".rev-cpicker-point-bottom").length
    \t



    \t
    {{delete}}
    {{delete}}
    ').appendTo(Z)),r||(r={}),r.core&&(r.core.colors&&(Pr=r.core.colors),r.core.gradients&&(zr=r.core.gradients)),Y(r),ne?(cr.perfectScrollbar("update"),r.mode&&(ve=r.mode),r.language&&n(r.language)):(n(r.language||Or),ve=r.mode||"full"),r.init&&(ie=r.init),r.onAjax&&(be=r.onAjax),r.onEdit&&(ge=r.onEdit),r.change&&(Ie=r.change),r.cancel&&(_e=r.cancel),r.widgetId&&(tr=r.widgetId),r.defaultValue&&(RevColor.defaultValue=r.defaultValue),r.wrapClasses&&(Rr=r.wrapClasses),r.appendedHtml&&(vr=r.appendedHtml),ne=!0};var Dr={refresh:function(){var r=e(this);if(r.hasClass("rev-cpicker-component")){var a=r.data("revcp")||{},t=r.val()||a.defaultValue||RevColor.defaultValue,i=RevColor.process(t);t=i[0],i="rgba"===i[1]&&RevColor.transparentRgba(t,!0)?"":t,"transparent"!==t?r.data("tpcp")[0].style.background=i:r.data("tpcp").css("background",""),r.attr("data-color",t).data("hex",t)}},destroy:function(){e(this).removeData().closest(".rev-cpicker-master-wrap").removeData().remove()}};e.fn.tpColorPicker=function(r){return r&&"string"==typeof r?this.each(Dr[r]):this.each(function(){var a=e(this);if(a.hasClass("rev-cpicker-component"))a.tpColorPicker("refresh");else{var t,i,o=e('').data("revcolorinput",a),c=e(''),n=e(''),s=a.attr("data-wrap-classes"),l=a.attr("data-wrapper"),p=a.attr("data-wrap-id"),v=a.attr("data-title"),d=a.attr("data-skin"),g=a.val()||"",b=W(g);if(b&&(g=b,a.val(b)),o.insertBefore(a).append([c,n,a]),r&&e.isPlainObject(r)){l||(l=r.wrapper),s||(s=r.wrapClasses),d||(d=r.skin),p||(p=r.wrapId),v||(v=r.title),i=r.defaultValue;var k=a.data("revcp");k&&(r=e.extend({},k,r)),a.data("revcp",r)}s||(s=Rr),s&&o.addClass(s),p&&o.attr("id",p),g||(g=i||RevColor.defaultValue,a.val(g)),g=(t=RevColor.process(g))[0],3===t.length&&a.val(g),"transparent"!==(t="rgba"===t[1]&&RevColor.transparentRgba(g,!0)?"":g)&&(c[0].style.background=t),n[0].innerHTML=v||Te||Or.color,a.attr({type:"hidden","data-color":g}).data("tpcp",c).addClass("rev-cpicker-component"),d&&o.addClass(d),l?(l=e(l).addClass("rev-cpicker-master-wrap"),o.wrap(l)):o.addClass("rev-cpicker-master-wrap");var u=!!r&&(r.init||ie);u&&u(o,a,g,r)}})},e(function(){e("body").on("click.revcpicker",".rev-colorpicker",function(){U||J();var r,a,t,i,o,c,s,p,v,g,b,k,u,f=(or=e(this).data("revcolorinput")).attr("data-widget-id"),m=or.attr("data-appended-html"),h=or.attr("data-editing"),C=or.attr("data-colors"),x=or.attr("data-mode"),y=or.data("revcp"),R=or.attr("data-lang");if(C&&((C=JSON.parse(C.replace(/\&/g,'"'))).colors&&(c=C.colors),C.gradients&&(i=C.gradients)),y){var _=y.colors;_&&(_.core&&(t=_.core.colors,r=_.core.gradients),_.custom&&(o=_.custom.colors,a=_.custom.gradients)),b=y.onEdit,k=y.onAjax,p=y.change,v=y.cancel,R||(R=y.lang),x||(x=y.mode),m||(m=y.appendedHtml),h||(h=y.editing),f||(f=y.widgetId)}(r||t||a||o||i||c)&&(s={},(r||t||i||c)&&(s.core={colors:c||t||Pr,gradients:i||r||zr}),(a||o)&&(s.custom={colors:o||Pr,gradients:a||zr}),Y(s)),f||(f=tr),f&&(ce[0].id=f),m||(m=vr),m&&(ye=e(m).appendTo(mr)),R&&n(R),x||(x=ve),h?ze.style.visibility="visible":(h="",ze.style.visibility="hidden"),wr.innerHTML=h,"single"===x||"basic"===x?(K=!1,le.hide(),ue.show(),"basic"===x&&ce.addClass("is-basic")):(K=!0,le.show(),ue.show()),(u=or.val()||or.attr("data-color")||RevColor.defaultValue).split("||").length>1&&(u=RevColor.joinToRgba(u),or.val(u)),g=d(u),lr=g[0],te=b||ge,oe=k||be,Re=v||_e,_r=p||Ie,"gradient"!==g[1]?ue.data("state",lr):le.data("state",lr),Z.addClass("rev-colorpicker-open"),dr=or.data("tpcp"),ce.data("revcpickerinput",or).addClass("active").show(),cr.each(w).perfectScrollbar("update"),pr=or.attr("data-color"),ir=or.data("hex"),e(".rev-cpicker-color").not(".blank").each(l)})})}("undefined"!==jQuery&&jQuery); \ No newline at end of file diff --git a/fassets/source/Autorikshaw.svg b/fassets/source/Autorikshaw.svg new file mode 100644 index 0000000..6115615 --- /dev/null +++ b/fassets/source/Autorikshaw.svg @@ -0,0 +1 @@ +2pt_icons_36x36px \ No newline at end of file diff --git a/fassets/source/car-side-view.svg b/fassets/source/car-side-view.svg new file mode 100644 index 0000000..bab9b0e --- /dev/null +++ b/fassets/source/car-side-view.svg @@ -0,0 +1 @@ +2pt_icons_36x36px \ No newline at end of file diff --git a/fassets/source/documentation.svg b/fassets/source/documentation.svg new file mode 100644 index 0000000..b0851be --- /dev/null +++ b/fassets/source/documentation.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/fassets/source/health.svg b/fassets/source/health.svg new file mode 100644 index 0000000..0e0db8d --- /dev/null +++ b/fassets/source/health.svg @@ -0,0 +1 @@ +2pt_icons_36x36px \ No newline at end of file diff --git a/fassets/source/home-page-virat-banner-1.svg b/fassets/source/home-page-virat-banner-1.svg new file mode 100644 index 0000000..954cb19 --- /dev/null +++ b/fassets/source/home-page-virat-banner-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fassets/source/loader(1).svg b/fassets/source/loader(1).svg new file mode 100644 index 0000000..0b0fbb1 --- /dev/null +++ b/fassets/source/loader(1).svg @@ -0,0 +1 @@ +Digit Loader (Small)Amber loading icon for Digit Insurance. \ No newline at end of file diff --git a/fassets/source/loader.svg b/fassets/source/loader.svg new file mode 100644 index 0000000..0b0fbb1 --- /dev/null +++ b/fassets/source/loader.svg @@ -0,0 +1 @@ +Digit Loader (Small)Amber loading icon for Digit Insurance. \ No newline at end of file diff --git a/fassets/source/mismatch_sample_3.svg b/fassets/source/mismatch_sample_3.svg new file mode 100644 index 0000000..cf9ebe5 --- /dev/null +++ b/fassets/source/mismatch_sample_3.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/fassets/source/more-icon.svg b/fassets/source/more-icon.svg new file mode 100644 index 0000000..f2fa42c --- /dev/null +++ b/fassets/source/more-icon.svg @@ -0,0 +1 @@ +2pt_icons_36x36px \ No newline at end of file diff --git a/fassets/source/motorcycle-side-view.svg b/fassets/source/motorcycle-side-view.svg new file mode 100644 index 0000000..d563766 --- /dev/null +++ b/fassets/source/motorcycle-side-view.svg @@ -0,0 +1 @@ +2pt_icons_36x36px \ No newline at end of file diff --git a/fassets/source/style.css b/fassets/source/style.css new file mode 100644 index 0000000..205d91a --- /dev/null +++ b/fassets/source/style.css @@ -0,0 +1,40 @@ +@charset "utf-8"; +.header_bg { background-color: #f5f5f5; background-image: url(source/home-page-virat-banner-1.svg); background-position: center; background-repeat: no-repeat; background-size: cover; min-height: 100vh; } +.header_sec h1 { color: #444; font-size: 32px; font-weight: 700; padding-top: 6rem; } +.header_sec p { color: #444; font-size: 18px; font-weight: 500; margin-bottom: 4rem; } +.header_sec .nav-pills .nav-link { color: #444; text-align: center; margin-right: 30px; padding: 0 0.25rem; cursor: pointer; } +.header_sec .nav-pills .nav-link:hover, .header_sec .nav-pills .nav-link.active, .header_sec .nav-pills .show>.nav-link { color: #e31e24; background-color: inherit; } +.header_sec .nav-pills .nav-link span { float: left; height: 65px; width: 65px; background-color: #fff; border: 2px solid #fff; margin: 5px 0; } +.header_sec .nav-pills .nav-link.active span, .header_sec .nav-pills .nav-link:hover span { border: 2px solid #e31e24; } +.header_sec .nav-pills .nav-link span img { height: 50px; width: 50px; margin: 5px; } +.form_sec { background: #fff; border: 1px solid #DDD; border-radius: 4px; margin-bottom: 10px; } +.form_sec .form-group { margin-bottom: 0; border-right: 1px solid #DDD; padding-top: 18px; padding-bottom: 18px; } +.form_sec .form-group label { color: #444; font-size: 16px; font-weight: 500; margin-bottom: 0; display: block; } +.form_sec .form-group .form-control { color: #000; font-size: 18px; font-weight: 400; padding: 0; border: none; height: 27px; } +.form_sec .form-group .form-control:focus { border-color: transparent; outline: 0; box-shadow: none; } +.form_sec .form-group .form-control::placeholder { color: #aaa; } +.form_sec button { height: 48px; width: 100%; background: #e31e24; border: 1px solid #e31e24; color: #fff; font-size: 18px; font-weight: 800; margin-top: 20px; } +.form_sec .form-group .add_extension span { float: left; width: 40px; } +.form_sec .form-group .add_extension input { float: left; width: calc(100% - 40px); } +.header_sec h2 { text-transform: uppercase; color: #e31e24; font-size: 12px; margin-right: 10px; margin-top: 5px; font-weight: 800; background-color: #fff; border-radius: 20px; padding: 8px 10px; height: 30px; display: -ms-inline-flexbox; display: inline-flex; } +.header_sec h2 i { margin-left: 10px; } +.header_sec .form-check-label a { color: #000; text-decoration: underline; } +.header_sec .radio_sec { display: block; position: relative; padding-left: 35px; margin-bottom: 12px; cursor: pointer; font-size: 22px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } +.header_sec .radio_sec input { position: absolute; opacity: 0; cursor: pointer; } +.header_sec .checkmark { position: absolute; top: 0; left: 0; height: 24px; width: 24px; background-color: #fff; border: 1px solid rgba(0,0,0,.36); border-radius: 50%; } +.header_sec .radio_sec input:checked ~ .checkmark { background-color: #fff; } +.header_sec .checkmark:after { content: ""; position: absolute; display: none; } +.header_sec .radio_sec input:checked ~ .checkmark:after { display: block; } +.header_sec .radio_sec .checkmark:after { top: 4px; left: 4px; width: 14px; height: 14px; border-radius: 50%; background: #e31e24; } +.more_product_modal .modal-header { border-bottom: none; } +.more_product_modal .modal-header h4 { font-size: 25px;margin: 0; color: #000; } +.more_product_modal .modal-header h4:after { content: " "; position: absolute; left: 1rem; top: 50px; background-color: #e31e24; height: 5px; width: 40px; border-radius: 10px; } +.more_product_modal .modal-body .img_sec { width: 45px; height: 45px; } +.more_product_modal .modal-body .img_sec img { width: 100%; height: 100%; } +.more_product_modal .modal-body p { font-size: 16px; font-weight: 900; margin-top: 18px; margin-bottom: 15px; } +.more_product_modal .modal-body ul { list-style-type: none; padding-left: 0; } +.more_product_modal .modal-body ul li { margin-bottom: 15px; } +.more_product_modal .modal-body ul li a { color: #444; font-size: 14px; text-decoration: none;font-weight: 400; line-height: 17px; letter-spacing: .7px; display: block; } +.more_product_modal .modal-body ul li a:hover, .modal-header .close:hover { color: #e31e24;} +.more_product_modal .modal-body .row .col:nth-child(even) { background: #f5f5f5; } +.more_product_modal .modal-body .row .col:nth-child(odd) { background: #fff; } \ No newline at end of file diff --git a/fassets/source/travel-airplane.svg b/fassets/source/travel-airplane.svg new file mode 100644 index 0000000..2e00f57 --- /dev/null +++ b/fassets/source/travel-airplane.svg @@ -0,0 +1 @@ +Travel \ No newline at end of file diff --git a/fassets/source/vk_thumbup.jpeg b/fassets/source/vk_thumbup.jpeg new file mode 100644 index 0000000..e69e8b6 Binary files /dev/null and b/fassets/source/vk_thumbup.jpeg differ diff --git a/fassets/style-import.css b/fassets/style-import.css new file mode 100644 index 0000000..43a732e --- /dev/null +++ b/fassets/style-import.css @@ -0,0 +1,55 @@ +/*----------------------------------------------------------------------------------- + + Theme Name: Canvas + Theme URI: http://themes.semicolonweb.com/html/canvas + Description: The Multi-Purpose Template + Author: SemiColonWeb + Author URI: http://themeforest.net/user/semicolonweb + Version: 6.5.2 + + SASS Stylesheet + +-----------------------------------------------------------------------------------*/ + +/* Bootstrap */ +@import url("css/imports/bootstrap.css"); + +/* Core CSS */ +@import url("css/imports/layouts.css"); +@import url("css/imports/typography.css"); +@import url("css/imports/utilities.css"); + + +/* Content Blocks */ +@import url("css/imports/topbar.css"); +@import url("css/imports/header.css"); +@import url("css/imports/sliders.css"); +@import url("css/imports/pagetitle.css"); +@import url("css/imports/content.css"); +@import url("css/imports/portfolio.css"); +@import url("css/imports/blog.css"); +@import url("css/imports/shop.css"); +@import url("css/imports/events.css"); + + +/* Shortcodes */ +@import url("css/imports/shortcodes.css"); + +/* Forms */ +@import url("css/imports/forms.css"); + +/* Footer */ +@import url("css/imports/footer.css"); + + +/* Widgets */ +@import url("css/imports/widgets.css"); + +/* Paginations */ +@import url("css/imports/paginations.css"); + +/* Extras */ +@import url("css/imports/extras.css"); + +/* Page Loaders */ +@import url("css/imports/page-loaders.css"); diff --git a/fassets/style-rtl.css b/fassets/style-rtl.css new file mode 100644 index 0000000..d347561 --- /dev/null +++ b/fassets/style-rtl.css @@ -0,0 +1,2856 @@ +/* ---------------------------------------------------------------- + + style-rtl.scss + +-----------------------------------------------------------------*/ + +html, +body { + direction: rtl; + text-align: right; +} + +.bgicon { + left: -50px; + right: auto; +} + +.vertical-middle-overlay { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Top Bar +-----------------------------------------------------------------*/ +/* Top Links +---------------------------------*/ +.top-links-item { + border-right: 1px solid #eee; + border-left: 0; +} + +.top-links-item:first-child, +.top-links-sub-menu .top-links-item { + border-right: 0 !important; +} + +.top-links-item > a > i.icon-angle-down { + margin: 0 5px 0 0 !important; +} + +.top-links-item > a > i:first-child { + margin-left: 3px; + margin-right: 0; +} + +.top-links-sub-menu, +.top-links-section { + right: -1px; + left: auto; +} + +.top-links-sub-menu .top-links-sub-menu { + right: 100%; + left: auto; +} + +.top-links-sub-menu .top-links-item > a > img { + margin-left: 4px; + margin-right: 0; +} + +.top-links-sub-menu .top-links-item > a > i.icon-angle-down { + left: 10px; + right: auto; +} + +.top-links-section { + left: auto; + right: 0; +} + +.top-links-section.menu-pos-invert { + right: auto; + left: 0; +} + +/* Top Social +-----------------------------------------------------------------*/ +#top-social li { + border-right: 1px solid #eee; + border-left: 0; +} + +#top-social li:first-child { + border-right: 0 !important; +} + +#top-social li a:hover .ts-text { + padding-left: 12px; + padding-right: 0; +} + +/* ---------------------------------------------------------------- +Header +-----------------------------------------------------------------*/ +@media (min-width: 992px) { + #header-wrap { + will-change: right, top, transform; + } +} + +@media (min-width: 992px) { + /* ---------------------------------------------------------------- + Sticky Header + -----------------------------------------------------------------*/ + .sticky-header #header-wrap { + right: 0; + left: auto; + } + + /* Primary Menu - Style 5 + -----------------------------------------------------------------*/ + .sticky-header-shrink .style-5 .menu-container > .menu-item { + margin-left: 0; + margin-right: 2px; + } + .sticky-header-shrink .style-5 .menu-container > .menu-item:first-child { + margin-right: 0; + } +} +@media (max-width: 991.98px) { + .sticky-header #header-wrap { + left: auto; + right: 0; + } +} +/* ---------------------------------------------------------------- + Logo +-----------------------------------------------------------------*/ +#logo { + margin-right: 0; + margin-left: auto; +} + +@media (min-width: 992px) { + .full-header #logo { + padding-left: 30px; + padding-right: 0; + border-left: 1px solid #eeeeee; + border-right: 0; + } + #header.transparent-header.full-header #logo { + border-left-color: rgba(0, 0, 0, 0.1); + border-right: 0; + } +} + +/* ---------------------------------------------------------------- + Header Right Area +-----------------------------------------------------------------*/ +.header-extras li { + margin-right: 1.25rem; + margin-left: 0; +} +.header-extras li:first-child { + margin-right: 0; +} +.header-extras li .he-text { + padding-right: 10px; + padding-left: 0; +} + +/* ---------------------------------------------------------------- + Primary Menu +-----------------------------------------------------------------*/ +.menu-link i { + margin-left: 6px; + margin-right: 0; +} + +.menu-item .sub-menu-trigger { + right: auto; + left: 0; +} +@media (min-width: 992px) { + .menu-item.menu-item-important .menu-link > div::after { + right: 5px; + left: auto; + } +} + +.sub-menu-container, +.mega-menu-content { + padding-right: 15px; + padding-left: 0; +} + +/* ---------------------------------------------------------------- + Mega Menu +-----------------------------------------------------------------*/ +.mega-menu-content { + padding-right: 0; + padding-left: 0; +} + +/* Off Canvas Menu +-----------------------------------------------------------------*/ +@media (max-width: 991.98px) { + body:not(.sticky-responsive-menu) .mobile-menu-off-canvas .menu-container { + left: auto !important; + right: 0 !important; + border-left: 1px solid #eeeeee !important; + border-right: 0 !important; + } + body:not(.sticky-responsive-menu) + .mobile-menu-off-canvas.from-right + .menu-container { + left: 0 !important; + right: auto !important; + border-left: 0 !important; + border-right: 1px solid #eeeeee !important; + } +} +@media (min-width: 992px) { + .full-header .primary-menu .menu-container { + padding-left: 0.5rem; + padding-right: 0; + margin-left: 0.5rem; + margin-right: 0; + border-left: 1px solid #eeeeee; + border-right: 0; + } + + .transparent-header.full-header .primary-menu .menu-container { + border-left-color: rgba(0, 0, 0, 0.1); + border-right: 0; + } + + .menu-container > .menu-item:not(:first-child) { + margin-right: 2px; + margin-left: 0; + } + + .sub-menu-container { + left: auto; + right: 0; + } + + .sub-menu-container .sub-menu-container { + right: 100%; + left: auto; + } + + .sub-menu-container.menu-pos-invert, + .mega-menu-content.menu-pos-invert { + left: 0; + right: auto; + } + + .sub-menu-container .sub-menu-container.menu-pos-invert { + right: auto; + left: 100%; + } + + .sub-menu-container .menu-item:hover > .menu-link { + padding-right: 18px; + padding-left: 0; + } + + .menu-link div > i.icon-angle-down { + margin: 0 5px 0 0; + } + + .sub-menu-container .menu-link div > i.icon-angle-down, + .side-header .primary-menu:not(.on-click) .menu-link i.icon-angle-down { + right: auto; + left: 0; + transform: translateY(-50%) rotate(90deg); + } + + /* ---------------------------------------------------------------- + Mega Menu + -----------------------------------------------------------------*/ + .mega-menu-small .mega-menu-content { + right: 0; + left: auto; + } + + .sub-menu-container .mega-menu-small .mega-menu-content { + right: 100%; + left: auto; + } + + .sub-menu-container .mega-menu-small .mega-menu-content.menu-pos-invert { + right: auto; + left: 100%; + } + + .mega-menu-content .sub-menu-container:not(.mega-menu-dropdown) { + right: 0; + left: auto; + } + + .sub-menu-container.mega-menu-column:not(:first-child) { + border-right: 1px solid #f2f2f2; + border-left: 0px; + } + + .mega-menu-style-2 .sub-menu-container .menu-link { + padding-right: 5px; + padding-left: 0; + } + + .mega-menu-style-2 .sub-menu-container .menu-item:hover > .menu-link { + padding-right: 12px; + padding-left: 0; + } + + /* Primary Menu - Style 2 + -----------------------------------------------------------------*/ + .style-2 #logo { + margin-left: 1.5rem; + margin-right: 0; + } + + .style-2 .primary-menu { + margin-left: auto; + margin-right: 0; + } + + /* Primary Menu - Style 5 + -----------------------------------------------------------------*/ + .style-5 .menu-container { + padding-left: 10px; + padding-right: 0; + margin-left: 5px; + margin-right: 0; + border-left: 1px solid #eeeeee; + border-right: 0; + } + + .style-5 .menu-container > .menu-item:not(:first-child) { + margin-right: 15px; + margin-left: 0; + } + + /* Primary Menu - Style 6 + -----------------------------------------------------------------*/ + .style-6 .menu-container > .menu-item > .menu-link::after, + .style-6 .menu-container > .menu-item.current > .menu-link::after { + left: auto; + right: 0; + } + + /* Primary Menu - Sub Title + -----------------------------------------------------------------*/ + .sub-title + .menu-container + > .menu-item:not(:first-child) + > .menu-link::before { + left: auto; + right: 0; + } + + .sub-title .menu-container > .menu-item:hover > .menu-link::after, + .sub-title .menu-container > .menu-item.current > .menu-link::after { + left: auto; + right: 0; + } + + /* ---------------------------------------------------------------- + Side Header + -----------------------------------------------------------------*/ + .side-header:not(.open-header) #wrapper { + margin: 0 260px 0 0 !important; + } + + .side-header #header { + right: 0; + left: auto; + border-left: 1px solid #eeeeee; + border-right: 0; + } + + .side-header #header-wrap { + padding-left: 40px; + padding-right: 0; + } + + .side-header .on-click .menu-item .sub-menu-trigger { + left: -5px; + right: auto; + } + + .side-header .primary-menu:not(.on-click) .text-center i.icon-angle-down { + margin-right: 5px; + margin-left: 0; + } + + .side-header .sub-menu-container, + .side-header .mega-menu-content { + left: auto; + right: 0; + padding: 0 12px 0 0 !important; + } + + .side-header .sub-menu-container .sub-menu-container { + right: 0; + left: auto; + } + + .side-header .sub-menu-container.menu-pos-invert { + left: auto; + right: 0; + } + + .side-header .sub-menu-container .sub-menu-container.menu-pos-invert { + right: 0; + left: auto; + } + + /* Side Header - Push Header + -----------------------------------------------------------------*/ + .side-header.open-header #header { + right: -260px; + left: auto; + } + + .side-header.open-header.side-header-open #header { + right: 0; + left: auto; + } + + .side-header.open-header #wrapper { + right: 0; + left: auto; + } + + .side-header.open-header.push-wrapper.side-header-open #wrapper { + right: 260px; + left: auto; + } + + .side-header.open-header #header-trigger { + right: 20px; + left: auto; + } + + .side-header.open-header.side-header-open #header-trigger { + right: 280px; + left: auto; + } + + /* Side Header - Right Aligned + -----------------------------------------------------------------*/ + .side-header.side-header-right #header { + left: 0; + right: auto; + border-right: 1px solid #eeeeee; + border-left: 0px; + } + + .side-header.side-header-right:not(.open-header) #wrapper { + margin: 0 0 0 260px !important; + } + + .side-header.side-header-right.open-header #header { + right: auto; + left: -260px; + } + + .side-header.side-header-right.open-header.side-header-open #header { + right: auto; + left: 0; + } + + .side-header.side-header-right.open-header.push-wrapper.side-header-open + #wrapper { + right: -260px; + left: auto; + } + + .side-header.side-header-right.open-header #header-trigger { + right: auto; + left: 20px; + } + + .side-header.side-header-right.open-header.side-header-open + #header-trigger { + right: auto; + left: 280px; + } + + /* Primary Menu - Overlay Menu + -----------------------------------------------------------------*/ + .overlay-menu .primary-menu > #overlay-menu-close { + right: auto; + left: 25px; + } + + .overlay-menu .primary-menu { + right: 0; + left: auto; + } + + .overlay-menu .sub-menu-container, + .overlay-menu .mega-menu-content { + right: 0 !important; + left: auto !important; + } + + .overlay-menu .sub-menu-container .menu-link i.icon-angle-down { + right: 0; + left: auto; + margin-right: 5px; + margin-left: 0px; + } +} +@media (max-width: 991.98px) { + .side-push-panel #side-panel-trigger-close a { + right: auto; + left: 0; + border-radius: 0 2px 0 0; + } +} +/* ---------------------------------------------------------------- + Top Search +-----------------------------------------------------------------*/ +.header-misc { + margin-right: 15px; + margin-left: 0; +} + +#top-search a i { + right: 3px; + left: auto; +} + +.top-search-form { + right: 0; + left: auto; +} +.top-search-form input { + padding: 10px 0 10px 80px; +} + +@media (min-width: 992px) { + .full-header .top-search-form input, + .container-fluid .top-search-form input, + .container-sm .top-search-form input, + .container-md .top-search-form input, + .container-lg .top-search-form input, + .container-xl .top-search-form input, + .container-xxl .top-search-form input { + padding-right: 30px; + padding-left: 0; + } +} +.search-overlay .top-search-form { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Top Cart +-----------------------------------------------------------------*/ +.top-cart-number { + right: auto; + left: -8px; +} +.top-cart-content { + right: auto; +} +@media (max-width: 991.98px) { + .top-cart-content { + left: -260px !important; + right: auto; + } +} +@media (min-width: 992px) { + .top-cart-content { + left: 0; + right: auto; + } +} +.top-cart-item-desc { + -ms-flex-align: end; + align-items: flex-end; +} +.top-cart-item-desc-title { + padding-right: 0; + padding-left: 0; +} +@media (max-width: 991.98px) { + .top-cart-open .top-cart-content { + left: 0 !important; + right: auto !important; + } +} + +/* ---------------------------------------------------------------- + Page Menu +-----------------------------------------------------------------*/ +#page-menu-wrap { + right: 0; + left: auto; +} + +#page-menu-trigger { + right: auto; + left: 15px; +} + +.page-menu-title { + margin-left: auto; + margin-right: 0; +} +.page-menu-nav { + right: auto; + left: 0; +} +@media (min-width: 992px) { + .page-menu-nav { + right: 0; + left: auto; + } +} +.page-menu-item > a .icon-angle-down { + right: auto; + left: 14px; +} +@media (min-width: 992px) { + .page-menu-item > a .icon-angle-down { + margin-right: 8px; + margin-left: 0; + } +} +@media (min-width: 992px) { + .page-menu-sub-menu { + right: 0; + left: auto; + } +} + +/* Page Menu - Dots Style +-----------------------------------------------------------------*/ +@media (min-width: 992px) { + #page-menu.dots-menu { + right: auto; + left: 20px; + } + + .dots-menu .page-menu-item div { + left: 25px; + right: auto; + } + .dots-menu .page-menu-item div::after { + right: auto; + left: -5px; + border-right: 6px solid #1abc9c; + border-left: 0; + } + .dots-menu .page-menu-item > a:hover div { + left: 30px; + right: auto; + } +} +/* ---------------------------------------------------------------- + One Page +-----------------------------------------------------------------*/ +.one-page-arrow { + right: 50%; + left: auto; + margin-right: -16px; + margin-left: 0; +} + +/* ---------------------------------------------------------------- + Side Push Panel +-----------------------------------------------------------------*/ +#side-panel { + left: -300px; + right: auto; +} +.side-panel-left #side-panel { + right: -300px; + left: auto; +} + +.side-push-panel.stretched #wrapper, +.side-push-panel.stretched .sticky-header .container { + left: 0; + right: auto; +} + +.side-panel-left.side-push-panel.stretched #wrapper, +.side-panel-left.side-push-panel.stretched .sticky-header .container { + right: 0; + left: auto; +} + +#side-panel .side-panel-wrap { + right: 0; + left: auto; +} +.side-panel-open #side-panel { + left: 0; + right: auto; +} +.side-panel-left.side-panel-open #side-panel { + right: 0; + left: auto; +} + +.side-push-panel.side-panel-open.stretched #wrapper, +.side-push-panel.side-panel-open.stretched .sticky-header .container { + left: 300px; + right: auto; +} + +.side-push-panel.side-panel-open.stretched.device-xl .slider-inner, +.side-push-panel.side-panel-open.stretched.device-lg .slider-inner { + right: -300px; + left: auto; +} + +.side-panel-left.side-push-panel.side-panel-open.stretched #wrapper, +.side-panel-left.side-push-panel.side-panel-open.stretched + .sticky-header + .container, +.side-panel-left.side-push-panel.side-panel-open.stretched .slider-inner { + right: 300px; + left: auto; +} + +#side-panel-trigger { + margin-left: 5px; + margin-right: 0; +} + +#side-panel, +.side-push-panel.stretched #wrapper, +.side-push-panel.stretched #header .container { + -webkit-transition: left 0.4s ease; + -o-transition: left 0.4s ease; + transition: left 0.4s ease; +} + +.side-panel-left #side-panel, +.side-panel-left.side-push-panel.stretched #wrapper, +.side-panel-left.side-push-panel.stretched #header .container, +.side-push-panel.stretched .slider-inner { + -webkit-transition: right 0.4s ease; + -o-transition: right 0.4s ease; + transition: right 0.4s ease; +} + +.body-overlay { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Slider +-----------------------------------------------------------------*/ +body:not(.side-header) .slider-parallax .slider-inner { + right: 0; + left: auto; +} + +body:not(.stretched) .slider-parallax .slider-inner { + right: auto; + left: 0; +} + +/* Swiper Slider +-----------------------------------------------------------------*/ +.slider-element .video-wrap, +.section .video-wrap, +.swiper-slide .yt-bg-player, +.section .yt-bg-player, +.swiper-slide-bg { + right: 0; + left: auto; +} + +/* Video Overlay +-----------------------------------------------------------------*/ +.video-overlay, +.video-placeholder { + right: 0; + left: auto; +} + +/* Slider Caption +-----------------------------------------------------------------*/ +.slider-caption.slider-caption-right { + margin-left: 0; + margin-right: auto; +} + +.slider-caption-bg { + right: 50px; + left: auto; +} + +.slider-caption-top-right { + right: auto; + left: 50px; +} + +.slider-caption-bottom-right { + right: auto; + left: 50px; +} + + + +/* Slide Number +-----------------------------------------------------------------*/ +.slide-number { + left: 20px; + right: auto; +} + +.slide-number-current, +.slide-number-total { + right: 0; + left: auto; +} + +.slide-number-total { + right: auto; + left: 0; +} + +/* Flex Slider - Navigation +-----------------------------------------------------------------*/ +.nav-offset .flex-prev { + right: 20px; + left: auto; +} + +.nav-offset .flex-next { + left: 20px; + right: auto; +} + +.nav-pos-top .flex-direction-nav, +.nav-pos-top-left .flex-direction-nav, +.nav-pos-top-right .flex-direction-nav { + right: 0; + left: auto; +} + +.nav-pos-top-left .flex-direction-nav, +.nav-pos-bottom-left .flex-direction-nav { + right: 16px; + left: auto; +} + +.nav-pos-top-right .flex-direction-nav, +.nav-pos-bottom-right .flex-direction-nav { + right: auto; + left: 16px; +} + +/* Flex Slider +-----------------------------------------------------------------*/ + +.flexslider { + direction: ltr; +} + +/* Flex Slider - Pagination & Thumbs +-----------------------------------------------------------------*/ +.flex-control-nav { + left: 10px; + right: auto; +} + +/* Flex Slider: Pagination Positions +-----------------------------------------------------------------*/ +.control-offset-lg .flex-control-nav { + left: 20px; + right: auto; +} + +.control-pos-top-left .flex-control-nav, +.control-pos-bottom-left .flex-control-nav { + right: 10px; + left: auto; +} + +.control-offset-lg.control-pos-top-left .flex-control-nav, +.control-offset-lg.control-pos-bottom-left .flex-control-nav { + right: 20px; + left: auto; +} + +.control-pos-bottom .flex-control-nav, +.control-pos-bottom .flex-control-nav, +.control-pos-top .flex-control-nav, +.control-pos-top .flex-control-nav { + left: 0; + right: auto; +} + +/* Flex Slider: Thumbs +-----------------------------------------------------------------*/ +.flex-control-nav.flex-control-thumbs { + direction: rtl; +} + +.flex-control-nav.flex-control-thumbs { + justify-content: right; + margin: 2px 0 -2px -2px; +} + +.flex-control-nav.flex-control-thumbs li { + margin: 0 0 2px 2px; +} + +/* FlexSlider: Thumbs - Flexible +-----------------------------------------------------------------*/ +.fslider.flex-thumb-grid .flex-control-nav.flex-control-thumbs { + margin: 2px 0 -2px -2px; +} + +.fslider.flex-thumb-grid .flex-control-nav.flex-control-thumbs li { + padding: 0 0 2px 2px; +} + +/* ---------------------------------------------------------------- + Page Title +-----------------------------------------------------------------*/ +#page-title { + text-align: right; +} + +@media (min-width: 768px) { + #page-title .breadcrumb { + right: auto !important; + left: 15px !important; + } +} + +@media (max-width: 767.98px) { + #page-title .breadcrumb { + justify-content: end; + } +} + +/* Page Title - Right Aligned +-----------------------------------------------------------------*/ +#page-title .page-title-right { + text-align: left; +} + +#page-title .page-title-right .breadcrumb { + right: 15px !important; + left: auto !important; +} + +#page-title .page-title-video .video-wrap { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Content +-----------------------------------------------------------------*/ +/* Portfolio - Filter +-----------------------------------------------------------------*/ +.grid-filter li { + float: right; +} + +.grid-filter li:first-child a { + border-right: none; + border-radius: 4px 4px 0 0; +} + +.grid-filter li:last-child a { + border-radius: 0 0 4px 4px; +} + +/* Portfolio - Filter: Style 2 +-----------------------------------------------------------------*/ +.grid-filter.style-2 li:not(:first-child), +.grid-filter.style-3 li:not(:first-child) { + margin-right: 10px; + margin-left: 0; +} + +/* Portfolio - Filter: Style 4 +-----------------------------------------------------------------*/ +.grid-filter.style-4 li:not(:first-child) { + margin-right: 30px; + margin-left: 0; +} + +.grid-filter.style-4 li a::after { + right: 50%; + left: auto; +} + +.grid-filter.style-4 li.activeFilter a::after { + right: 0%; + left: auto; +} + +/* Portfolio Single - Meta +-----------------------------------------------------------------*/ +.portfolio-meta li span i { + margin-left: 7px; + margin-right: 0; +} + +/* Portfolio Single Navigation +-----------------------------------------------------------------*/ +#portfolio-navigation { + right: auto; + left: 10px; +} + +.page-title-right #portfolio-navigation { + right: 10px; + left: auto; +} + +.page-title-center #portfolio-navigation { + right: 0; + left: auto; +} + +#portfolio-navigation a { + float: left; + margin-left: 12px; +} + +#portfolio-navigation a i.icon-angle-right { + right: -1px; + left: auto; +} + +#portfolio-navigation a:first-child { + margin-right: 0; +} + +/* ---------------------------------------------------------------- + Blog +-----------------------------------------------------------------*/ +.entry-meta ul { + margin: 0 -20px -10px 0; +} + +.entry-meta.no-separator ul, +.entry-meta ul.flex-column { + align-items: flex-end; +} + +.entry-meta li { + margin: 0 0 10px 15px; +} + +.entry-meta ul.flex-column li { + margin-right: 0; +} + +.entry-meta:not(.no-separator) li::before { + margin-left: 15px; + margin-right: 0; +} + +.entry-meta i { + padding-right: 1px; + margin-left: 5px; + padding-left: 0; + margin-right: 0; +} + +/* Blog - Grid +-----------------------------------------------------------------*/ +/* Blog - Timeline +-----------------------------------------------------------------*/ +@media (min-width: 992px) { + .postcontent .post-timeline::before { + right: 50%; + left: auto; + border-right: 1px dashed #ccc; + border-left: 0; + } + + .post-timeline .entry-timeline { + right: auto; + left: -6px; + } + + .post-timeline .entry-timeline .timeline-divider { + right: auto; + left: 15px; + } + + .post-timeline .entry:not(.entry-date-section) { + padding-left: 85px; + padding-right: 0; + } + + .post-timeline .entry.alt:not(.entry-date-section) { + padding-left: inherit; + padding-right: 85px; + } + + .post-timeline .alt .entry-timeline { + left: auto; + right: -6px; + } + + .post-timeline .alt .entry-timeline .timeline-divider { + right: 15px; + left: auto; + } +} + +@media (min-width: 992px) { + /* Blog - Timeline - Sidebar + -----------------------------------------------------------------*/ + + .postcontent .post-timeline::before { + right: -68px; + left: auto; + margin-right: 0; + margin-left: 0; + } + + .postcontent .post-timeline { + padding-right: 0; + margin-right: 100px !important; + margin-left: 0 !important; + } + + .postcontent .post-timeline .entry-timeline { + right: -100px; + left: auto; + } + + .postcontent .post-timeline .entry-timeline div.timeline-divider { + right: 64px; + left: auto; + } +} + +/* ---------------------------------------------------------------- + Blog - Author +-----------------------------------------------------------------*/ +.author-image { + float: right; + margin-left: 15px; + margin-right: 0; +} + +/* ---------------------------------------------------------------- + Comments List +-----------------------------------------------------------------*/ +.commentlist li { + margin: 30px 30px 0 0; +} + +.comment-wrap { + padding: 20px 35px 20px 20px; +} + +.commentlist ul .comment-wrap { + margin-right: 25px; + margin-left: 0; + padding-right: 20px; + padding-left: 0; +} + +#reviews .comment-wrap { + padding: 10px 35px 0 0; +} + +.commentlist li li .children { + margin-right: 30px; + margin-left: 0; +} + +.commentlist li .comment-content { + padding: 0 15px 0 0; +} + +.commentlist li .comment-meta { + float: right; + margin-left: 0; +} + +.comment-avatar { + right: -35px; + left: auto; +} + +.commentlist li .children .comment-avatar { + right: -25px; + left: auto; +} + +.comment-reply-link, +.review-comment-ratings { + right: auto; + left: 0; +} + +/* ---------------------------------------------------------------- + Comment Form +-----------------------------------------------------------------*/ +.commentlist li li #respond { + margin-right: 30px; + margin-left: 0; +} + +/* Post Elements +-----------------------------------------------------------------*/ +img.alignleft, +div.alignleft { + float: right; + margin: 5px 0 13px 20px; +} + +img.alignright, +div.alignright { + float: left; + margin: 5px 20px 13px 0; +} + +/* Infinity Scroll - Message Style +-----------------------------------------------------------------*/ +#infscr-loading, +#portfolio-ajax-loader { + right: 50%; + left: auto; + margin: -24px -24px 0 0; +} + +/* ---------------------------------------------------------------- + Shop +-----------------------------------------------------------------*/ +.product-image > a:nth-of-type(2) { + right: 0; + left: auto; +} + +.product-image > .badge, +.sale-flash { + right: 10px; + left: auto; +} + +/* Shop - Single +-----------------------------------------------------------------*/ +.quantity { + margin-left: 30px; + margin-right: 0; +} + +.single-product .feature-box.fbox-plain.fbox-small { + padding-right: 26px; + padding-left: 0; +} + +.single-product .feature-box.fbox-plain.fbox-small p { + margin-right: -26px; + margin-right: 0; +} + +/* ---------------------------------------------------------------- + Events +-----------------------------------------------------------------*/ +.event .entry-image .entry-date { + right: 10px; + left: auto; +} + +.single-event .entry-overlay, +.parallax .entry-overlay-meta { + right: 0; + left: auto; +} + +.single-event .countdown-section { + border-right-color: rgba(255, 255, 255, 0.3); + border-left-color: transparent; +} + +.parallax .entry-overlay, +.parallax .entry-overlay-meta { + text-align: left; + right: auto; + left: 30px; +} + +.parallax .entry-overlay-meta { + text-align: right; + left: 38px; + right: auto; +} + +.parallax.overlay-left .entry-overlay, +.parallax.overlay-left .entry-overlay-meta { + right: 30px; + left: auto; +} + +.parallax.overlay-left .entry-overlay-meta { + right: 38px; + left: auto; +} + +.parallax.overlay-center .entry-overlay, +.parallax.overlay-center .entry-overlay-meta { + right: 50%; + left: auto; + margin-right: -192px; + margin-right: 0; +} + +.parallax.overlay-center .entry-overlay-meta { + margin-right: -184px; + margin-left: 0; +} + +.parallax .countdown-section { + border-right: 0; +} + +/* ---------------------------------------------------------------- + + Countdown + + -----------------------------------------------------------------*/ +.countdown-section { + border-right: 1px dotted #bbb; + border-left: 0; +} + +.countdown-section:first-child { + border-right: 0; +} + +/* Countdown - Inline +-----------------------------------------------------------------*/ +.countdown.countdown-inline .countdown-section { + margin-right: 7px; + margin-left: 0; +} + +.countdown.countdown-inline .countdown-section:first-child { + margin-right: 0; + margin-left: 0; +} + +.countdown.countdown-inline .countdown-amount { + margin: 0 0 0 3px; +} + +/* ---------------------------------------------------------------- + Buttons +-----------------------------------------------------------------*/ +.button i { + margin-left: 5px; + margin-right: 0; +} + +.button.text-end i { + margin: 0 5px 0 0; +} + +.button-mini i { + margin-left: 3px; + margin-right: 0; +} + +.button-mini.text-end i { + margin: 0 3px 0 0; +} + +.button-small i { + margin-left: 4px; + margin-right: 0; +} + +.button-small.text-end i { + margin: 0 4px 0 0; +} + +.button-xlarge i { + margin-left: 8px; + margin-right: 0; +} + +.button-xlarge.text-end i { + margin: 0 8px 0 0; +} + +.button.button-desc i { + margin-left: 12px; + margin-right: 0; +} + +.button.button-desc.text-end i { + margin: 0 12px 0 0; +} + +/* Buttons - Icon Reveal +-----------------------------------------------------------------*/ +.button.button-reveal i { + right: -32px; + left: auto; +} + +.button.button-reveal.text-end i { + right: auto; + left: -32px; +} + +.button.button-reveal.button-3d i, +.button.button-reveal.button-rounded i { + border-radius: 3px 3px 0 0; +} + +.button.button-reveal.button-3d.text-end i, +.button.button-reveal.button-rounded.text-end i { + border-radius: 0 0 3px 3px; +} + +.button.button-reveal span { + right: 0; + left: auto; +} + +.button.button-reveal.button-mini i { + right: -22px; + left: auto; +} + +.button.button-reveal.button-mini.text-end i { + right: auto; + left: -22px; +} + +.button.button-reveal.button-small i { + right: -26px; + left: auto; +} + +.button.button-reveal.button-small.text-end i { + right: auto; + left: -26px; +} + +.button.button-reveal.button-large i { + right: -38px; + left: auto; +} + +.button.button-reveal.button-large.text-end i { + right: auto; + left: -38px; +} + +.button.button-reveal.button-xlarge i { + right: -44px; + left: auto; +} + +.button.button-reveal.button-xlarge.text-end i { + right: auto; + left: -44px; +} + +.button.button-reveal:hover i { + right: 0; + left: auto; +} + +.button.button-reveal.text-end:hover i { + right: auto; + left: 0; +} + +.button.button-reveal:hover span { + right: 16px; + left: auto; +} + +.button.button-reveal.button-mini:hover span { + right: 11px; + left: auto; +} + +.button.button-reveal.button-small:hover span { + right: 13px; + left: auto; +} + +.button.button-reveal.button-large:hover span { + right: 19px; + left: auto; +} + +.button.button-reveal.button-xlarge:hover span { + right: 22px; + left: auto; +} + +.button.button-reveal.text-end:hover span { + right: -16px; + left: auto; +} + +.button.button-reveal.button-mini.text-end:hover span { + right: -11px; + left: auto; +} + +.button.button-reveal.button-small.text-end:hover span { + right: -13px; + left: auto; +} + +.button.button-reveal.button-large.text-end:hover span { + right: -19px; + left: auto; +} + +.button.button-reveal.button-xlarge.text-end:hover span { + right: -22px; + left: auto; +} + +/* Buttons - Fill Effect +-----------------------------------------------------------------*/ +.button.button-border.button-fill::before { + right: 0; + left: auto; +} + +.button.button-border.button-fill.fill-from-right::before { + right: auto; + left: 0; +} + +/* Promo - Mini +-----------------------------------------------------------------*/ +.promo-mini { + text-align: right; +} + +/* Animated Icon Hovers +-----------------------------------------------------------------*/ +.fbox-effect .fbox-icon i::after { + right: -3px; + left: auto; +} + +/* Icon Effects - Bordered +-----------------------------------------------------------------*/ +.fbox-border.fbox-effect .fbox-icon i::after { + right: -2px; + left: auto; +} + +/* Media Featured Box +-----------------------------------------------------------------*/ +.feature-box.media-box.fbox-bg .fbox-desc { + border-radius: 0 5px 5px 0; +} + +.feature-box.media-box.fbox-bg .fbox-media img { + border-radius: 5px 0 0 5px; +} + +/* ---------------------------------------------------------------- + Flipbox +-----------------------------------------------------------------*/ +.flipbox-back { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Process Steps +-----------------------------------------------------------------*/ +.process-steps li::before, +.process-steps li::after { + right: 0; + left: auto; + margin-right: -26px; + margin-left: 0; +} + +.process-steps li::after { + right: auto; + left: 0; +} + +/* ---------------------------------------------------------------- + Alerts +-----------------------------------------------------------------*/ +.style-msg, +.style-msg2 { + border-right: 4px solid rgba(0, 0, 0, 0.1); + border-left: 0; +} + +.style-msg2 { + border-right: 4px solid rgba(0, 0, 0, 0.2); + border-left: 0; +} + +.style-msg .sb-msg, +.style-msg2 .msgtitle, +.style-msg2 .sb-msg { + border-right: 1px solid rgba(255, 255, 255, 0.5); + border-left: 0; +} + +.alert i, +.sb-msg i, +.msgtitle i { + margin-left: 5px; + margin-right: 0; +} + +.style-msg .close { + right: auto; + left: 10px; +} + +/* ---------------------------------------------------------------- + Styled Icons +-----------------------------------------------------------------*/ +.i-rounded, +.i-plain, +.i-circled, +.i-bordered, +.social-icon { + float: right; + margin: 4px 0 7px 11px; +} + +/* Icon Size - Small +-----------------------------------------------------------------*/ +.i-small.i-rounded, +.i-small.i-plain, +.i-small.i-circled, +.i-small.i-bordered { + margin: 4px 0 7px 11px; +} + +/* Icon Size - Small +-----------------------------------------------------------------*/ +.i-medium.i-rounded, +.i-medium.i-plain, +.i-medium.i-circled, +.i-medium.i-bordered { + margin: 6px 0px 9px 13px; +} + +/* Icon Size - Large +-----------------------------------------------------------------*/ +.i-large.i-rounded, +.i-large.i-plain, +.i-large.i-circled, +.i-large.i-bordered { + margin: 4px 0 7px 11px; +} + +/* Icon Size - Extra Large +-----------------------------------------------------------------*/ +.i-xlarge.i-rounded, +.i-xlarge.i-plain, +.i-xlarge.i-circled, +.i-xlarge.i-bordered { + margin: 4px 0 7px 11px; +} + +/* Icon Size - Extra Extra Large +-----------------------------------------------------------------*/ +.i-xxlarge.i-rounded, +.i-xxlarge.i-plain, +.i-xxlarge.i-circled, +.i-xxlarge.i-bordered { + margin: 6px 0 10px 15px; +} + +/* ---------------------------------------------------------------- + Social Icons +-----------------------------------------------------------------*/ +.social-icon { + margin: 0 0 5px 5px; +} + +/* Social Icons - Large +-----------------------------------------------------------------*/ +.social-icon.si-large { + margin: 0 0 10px 10px; +} + +/* Social Icons - Sticky +-----------------------------------------------------------------*/ +.si-sticky { + right: 5px; + left: auto; +} + +/* Social Icons - Sticky Right +-----------------------------------------------------------------*/ +.si-sticky.si-sticky-right { + right: auto; + left: 8px; +} + +/* Social Icons - Share +-----------------------------------------------------------------*/ +.si-share { + padding-right: 5px; + padding-left: 0; +} + +/* ---------------------------------------------------------------- + Tabs +-----------------------------------------------------------------*/ +.tab-nav li { + border-right: 0; +} + +.tab-nav li:first-child { + border-right: 1px solid #ddd; + border-left: 0; +} + +/* Tabs - Alternate Nav +-----------------------------------------------------------------*/ +.tabs-alt .tab-nav li:first-child { + border-right: 0; +} + +/* Tabs - Navigation Style 2 +-----------------------------------------------------------------*/ +.tab-nav.tab-nav2 li { + margin-right: 10px; + margin-left: 0; +} + +.tab-nav.tab-nav2 li:first-child { + margin-right: 0; + border-right: 0; +} + +/* Tabs - Large Navigation +-----------------------------------------------------------------*/ +.tab-nav-lg.tab-nav-section li.ui-tabs-active::after { + right: 50%; + left: auto; + margin-right: -16px; + margin-left: 0; +} + +.tab-nav-lg.tab-nav-section li.ui-tabs-active::before { + right: 50%; + left: auto; + margin-right: -16px; + margin-left: 0px; +} + +/* Tabs - Content Area +-----------------------------------------------------------------*/ +.tab-nav i { + margin-left: 3px; + margin-right: 0; +} + +/* Tabs - Bordered +-----------------------------------------------------------------*/ +.tabs-bordered .tab-nav li:first-child { + margin-right: 0; +} + +/* Tabs - Side Tabs +-----------------------------------------------------------------*/ +@media (min-width: 768px) { + .side-tabs .tab-nav li { + text-align: right; + } + + .side-tabs .tab-nav li:first-child { + margin-right: 0; + border-right: 1px solid #ddd; + border-left: 0; + } + + .side-tabs .tab-nav li.ui-tabs-active a { + left: -1px; + right: auto; + } + + .ui-tabs .ui-tabs-hide { + right: -10000px !important; + left: auto !important; + } + + .side-tabs .tab-nav.tab-nav2 li.ui-state-active a { + left: 0; + right: auto; + } +} +/* Tabs - Side Tabs & Bordered +-----------------------------------------------------------------*/ +.tabs-bordered.side-tabs .tab-nav { + margin-right: -1px; + margin-left: 0; +} + +.tabs-bordered.side-tabs .tab-nav li.ui-tabs-active a { + left: -1px; + right: auto; + border-left: 1px solid #fff; + border-right: 0; +} + +/* ---------------------------------------------------------------- + Side Navigation +-----------------------------------------------------------------*/ +.sidenav li a { + padding: 11px 14px 11px 20px; + border-left-width: 2px; + border-right-width: 0; +} + +.sidenav > li:first-child > a { + border-radius: 4px 0px 0 4px; +} + +.sidenav > li:last-child > a { + border-radius: 0 4px 4px 0px; +} + +.sidenav li li a { + padding: 6px 35px 6px 20px; +} + +.sidenav li i { + margin-left: 6px; + margin-right: 0; +} + +/* Chevrons */ +.sidenav .icon-chevron-right { + left: auto; + right: 6px; + margin-left: 0; +} + +/* ---------------------------------------------------------------- + Clients +-----------------------------------------------------------------*/ +.clients-grid .grid-item::before, +.testimonials-grid .grid-item::before { + right: -1px; + left: auto; + border-right: 1px dashed #ddd; + border-left: 0; +} + +.clients-grid .grid-item::after, +.testimonials-grid .grid-item::after { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Testimonials +-----------------------------------------------------------------*/ +/* Testimonials - Item +-----------------------------------------------------------------*/ +.testi-image { + float: right; + margin-left: 15px; + margin-right: 0; +} + +.testi-meta span { + padding-right: 10px; + padding-left: 0; +} + +/* Twitter - Small Scroller +-----------------------------------------------------------------*/ +.testimonial.twitter-scroll .testi-meta span { + padding-right: 0; +} + +/* Testimonials - Full Width +-----------------------------------------------------------------*/ +.testimonial-full .testi-meta span { + padding-right: 0; +} + +/* Testimonial - Pagination +-----------------------------------------------------------------*/ +.testimonial .flex-control-nav { + left: 0; + right: auto; +} + +/* ---------------------------------------------------------------- + Team +-----------------------------------------------------------------*/ +.team .si-share, +.team-image .si-share { + text-align: right; +} + +/* Team Center +-----------------------------------------------------------------*/ +.team.center .team-title::after, +.center.team-image .team-title::after { + right: 50%; + left: auto; + margin-right: -40px; + margin-left: 0; +} + +/* Team List +-----------------------------------------------------------------*/ +.team.team-list .team-image, +.team-list.team-image .team-image { + float: right; + margin-left: 30px; + margin-right: 0; +} + +.team.team-list .team-desc, +.team-list.team-image .team-desc { + text-align: right; +} + +/* ---------------------------------------------------------------- + Pricing Boxes +-----------------------------------------------------------------*/ +/* Pricing Boxes - Title +-----------------------------------------------------------------*/ +.pricing-title { + border-radius: 3px 0 0 3px; +} + +/* Pricing Boxes - Price +-----------------------------------------------------------------*/ +.pricing-price::after { + right: 50%; + left: auto; + margin-right: -50px; + margin-left: 0; +} + +.pricing-price span { + margin: 7px 0px 0 3px; +} + +.pricing-price span.price-tenure { + margin: 0 3px 0 0; +} + +/* Pricing Boxes - 5 Columns +-----------------------------------------------------------------*/ +.pricing.pricing-5 .pricing-box { + float: right; +} + +.pricing.pricing-5 .pricing-box:nth-child(5) { + margin-right: -1px; + margin-left: 0; +} + +/* Pricing Boxes - Extended +-----------------------------------------------------------------*/ +.pricing-box.pricing-extended { + text-align: right; +} + +.pricing-box.pricing-extended .pricing-desc { + float: right; +} + +.pricing-box.pricing-extended .pricing-title { + text-align: right; +} + +.pricing-box.pricing-extended .pricing-features li { + float: right; +} + +.pricing-box.pricing-extended .pricing-features ul li i { + margin-left: 2px; + margin-right: 0; +} + +.pricing-box.pricing-extended .pricing-action-area { + right: auto; + left: 0; + border-right: 1px solid rgba(0, 0, 0, 0.05); + border-left: 0; + border-radius: 0 0px 3px 3px; +} + +.table-comparison th:first-child, +.table-comparison td:first-child { + text-align: right; +} + +/* ---------------------------------------------------------------- + Animated Rounded Skills +-----------------------------------------------------------------*/ +.rounded-skill canvas { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Skills Bar +-----------------------------------------------------------------*/ +.skills li .progress { + right: 0; + left: auto; +} + +.skills li .progress-percent { + left: 0; + right: auto; +} + +.progress-percent::after { + right: 50%; + left: auto; + margin-right: -4px; + margin-left: 0; +} + +.progress-percent::before { + right: 50%; + left: auto; + margin-right: -5px; + margin-left: 0; +} + +.skills li > span { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Quotes & Blockquotes +-----------------------------------------------------------------*/ +blockquote { + border-right: 5px solid #eee; + border-left: 0; +} + +.blockquote-reverse { + padding-left: 15px; + padding-right: 0; + border-left: 5px solid #eee; + border-right: 0; + text-align: left; +} + +blockquote.float-start { + margin: 5px 0px 10px 20px; + padding-left: 0; +} + +blockquote.float-end { + margin: 5px 20px 10px 0px; + padding-right: 0; +} + +.quote::before { + right: 0; + left: auto; +} + +.quote.blockquote-reverse::before { + left: auto; + right: 0; +} + +/* ---------------------------------------------------------------- + Dropcaps & Highlights +-----------------------------------------------------------------*/ +.dropcap { + float: right; + margin: 0 0 0 5px; +} + +/* ---------------------------------------------------------------- + Owl Carousel CSS +-----------------------------------------------------------------*/ +.owl-carousel .owl-item { + float: right; +} + +.owl-carousel .owl-video-play-icon { + right: 50%; + left: auto; + margin-right: -32px; + margin-left: 0; +} + +/* Owl Carousel - Controls - Arrows +-----------------------------------------------------------------*/ +.owl-carousel .owl-nav [class*="owl-"] { + right: -36px; + left: auto; +} + +.slider-element .owl-nav [class*="owl-"], +.owl-carousel-full .owl-nav [class*="owl-"] { + right: 0 !important; + left: auto !important; + border-radius: 0 0 3px 3px; +} + +.owl-carousel .owl-nav .owl-next { + right: auto; + left: -36px; +} + +.slider-element .owl-nav .owl-next, +.owl-carousel-full .owl-nav .owl-next { + right: auto !important; + left: 0 !important; + border-radius: 3px 3px 0 0px; +} + +.owl-carousel:hover .owl-nav [class*="owl-"] { + right: -18px; + left: auto; +} + +.owl-carousel:hover .owl-nav .owl-next { + right: auto; + left: -18px; +} + +/* ---------------------------------------------------------------- + Flip Cards +-----------------------------------------------------------------*/ +.flip-card-front::after, +.flip-card-back::after, +.flip-card-back, +.flip-card-inner, +.bg-overlay, +.bg-overlay-bg, +.bg-overlay-content, +#map-overlay .gmap { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Google Custom Search +-----------------------------------------------------------------*/ +#content .gsc-result-info { + padding-right: 0 !important; +} + +/* ---------------------------------------------------------------- + Heading Styles +-----------------------------------------------------------------*/ + +@media (min-width: 768px) { + .text-md-start .heading-block::after { + margin-right: 0 !important; + } +} + +/* Block Titles +-----------------------------------------------------------------*/ +.title-block { + padding: 2px 20px 3px 0px; + border-right: 7px solid #1abc9c; + border-left: 0; +} + +.title-block-right { + padding: 2px 0px 3px 20px; + border-right: 0; + border-left: 7px solid #1abc9c; + text-align: left; +} + +/* Justify Border Title +-----------------------------------------------------------------*/ +.fancy-title h1, +.fancy-title h2, +.fancy-title h3, +.fancy-title h4, +.fancy-title h5, +.fancy-title h6 { + padding-left: 15px; + padding-right: 0; +} + +.fancy-title h4, +.fancy-title h5, +.fancy-title h6 { + padding-left: 10px; + padding-right: 0; +} + +.fancy-title.title-double-border::before, +.fancy-title.title-border::before, +.fancy-title.title-border-color::before { + right: auto; + left: 0; +} + +/* Fancy Title - Right Align +-----------------------------------------------------------------*/ +.title-right { + text-align: left; +} + +.title-right h1, +.title-right h2, +.title-right h3 { + padding: 0 15px 0 0px; +} + +.title-right h4, +.title-right h5, +.title-right h6 { + padding: 0 10px 0 0px; +} + +/* ---------------------------------------------------------------- + Divider +-----------------------------------------------------------------*/ +.divider::before { + margin-left: 0.5rem; + margin-right: 0; +} + +.divider::after { + margin-right: 0.5rem; + margin-left: 0; +} + +/* ---------------------------------------------------------------- + Magazine Specific Classes +-----------------------------------------------------------------*/ +.bnews-title { + float: right; +} + +.bnews-slider { + float: right; + margin-right: 20px; + margin-left: 0; +} + +/* ---------------------------------------------------------------- + Go To Top +-----------------------------------------------------------------*/ +#gotoTop { + right: auto; + left: 30px; +} + +/* ---------------------------------------------------------------- + Read More +-----------------------------------------------------------------*/ +.read-more-wrap .read-more-mask { + right: 0; + left: auto; +} + +.read-more-trigger i { + margin-right: 3px; + margin-left: 0; +} + +.read-more-wrap .read-more-trigger { + right: 5px; + left: auto; +} + +/* ---------------------------------------------------------------- + GDPR Settings +-----------------------------------------------------------------*/ +.gdpr-settings { + right: 1rem; + left: auto; +} + +.gdpr-settings-sm { + margin-left: 1rem; + margin-right: 0; +} + +.gdpr-settings-sm.gdpr-settings-right { + right: auto; + left: 1rem; + margin-left: 0; + margin-right: 1rem; +} + +/* ---------------------------------------------------------------- + Landing Pages +-----------------------------------------------------------------*/ +.landing-form-overlay { + right: auto; + left: 0; + border-radius: 3px 0px 0 3px; +} + +.landing-video { + margin: 22px 95px 0 0px; +} + +/* ---------------------------------------------------------------- + Preloaders +-----------------------------------------------------------------*/ +.form-process { + right: 0; + left: auto; +} + +/* ---------------------------------------------------------------- + Toastr Notifications +-----------------------------------------------------------------*/ +.toast-progress { + right: 0; + left: auto; +} + +/*Responsive Design*/ +@media all and (max-width: 240px) { + #toast-container .toast-close-button { + left: -0.2em; + right: auto; + } +} +@media all and (min-width: 241px) and (max-width: 480px) { + #toast-container .toast-close-button { + left: -0.2em; + right: auto; + } +} +/* ---------------------------------------------------------------- + Footer +-----------------------------------------------------------------*/ +.device-xl.sticky-footer #footer, +.device-lg.sticky-footer #footer { + right: 0; + left: auto; +} + +.device-xl.sticky-footer:not(.stretched) #footer, +.device-lg.sticky-footer:not(.stretched) #footer { + right: 50%; + left: auto; + margin-right: -610px; + margin-left: 0; +} + +.device-lg.sticky-footer:not(.stretched) #footer { + margin-right: -500px; + margin-left: 0; +} + +#copyrights a:first-child { + margin-right: 0; +} + +#copyrights .text-end a:last-child { + margin-left: 0; +} + +/* Tag Cloud +-----------------------------------------------------------------*/ +.tagcloud a { + float: right; + margin-left: 4px; + margin-right: 0; +} + +/* Widget - Links +-----------------------------------------------------------------*/ +.widget_nav_menu:not(.widget-li-noicon) li::before, +.widget_links:not(.widget-li-noicon) li::before, +.widget_meta:not(.widget-li-noicon) li::before, +.widget_archive:not(.widget-li-noicon) li::before, +.widget_recent_entries:not(.widget-li-noicon) li::before, +.widget_categories:not(.widget-li-noicon) li::before, +.widget_pages:not(.widget-li-noicon) li::before, +.widget_rss:not(.widget-li-noicon) li::before, +.widget_recent_comments:not(.widget-li-noicon) li::before { + right: 0; + left: auto; + transform: rotate(180deg); +} + +.widget_nav_menu li a, +.widget_links li a, +.widget_meta li a, +.widget_archive li a, +.widget_recent_entries li a, +.widget_categories li a, +.widget_pages li a, +.widget_rss li a, +.widget_recent_comments li a { + padding: 0 12px 0 3px; +} + +.widget_nav_menu.widget-li-noicon li a, +.widget_links.widget-li-noicon li a, +.widget_meta.widget-li-noicon li a, +.widget_archive.widget-li-noicon li a, +.widget_recent_entries.widget-li-noicon li a, +.widget_categories.widget-li-noicon li a, +.widget_pages.widget-li-noicon li a, +.widget_rss.widget-li-noicon li a, +.widget_recent_comments.widget-li-noicon li a { + padding-right: 0; +} + +.widget_nav_menu ul ul, +.widget_links ul ul, +.widget_meta ul ul, +.widget_archive ul ul, +.widget_recent_comments ul ul, +.widget_recent_entries ul ul, +.widget_categories ul ul, +.widget_pages ul ul, +.widget_rss ul ul { + margin-right: 15px; + margin-left: 0; +} + +/* Widget - Testimonial & Twitter +-----------------------------------------------------------------*/ +.widget .testimonial.twitter-scroll .testi-image { + margin-left: 10px; + margin-right: 0; +} + +/* Twitter Feed Widget +-----------------------------------------------------------------*/ +.widget-twitter-feed .twitter-feed-avatar { + margin-right: 44px; + margin-left: 0; +} + +.widget-twitter-feed .twitter-feed-avatar > li a.twitter-avatar { + right: -44px; + left: auto; +} + +/* Widget Filter Links +-----------------------------------------------------------------*/ +.widget-filter-links .widget-filter-reset { + right: auto; + left: 0; +} + +.widget-filter-links li span { + right: auto; + left: 0; +} + +/* Navigation Tree +-----------------------------------------------------------------*/ +.nav-tree li i:not(.icon-angle-down) { + margin-left: 8px; + margin-right: 0; +} + +.nav-tree li a i.icon-angle-down { + margin-right: 2px; + margin-left: 0; +} + +.nav-tree ul ul a { + padding-right: 20px; + padding-left: 0; +} + +.nav-tree ul ul ul a { + padding-right: 40px; + padding-left: 0; +} + +.nav-tree ul ul ul ul a { + padding-right: 60px; + padding-left: 0; +} + +.nav-tree ul ul ul ul ul a { + padding-right: 80px; + padding-left: 0; +} + +/* ---------------------------------------------------------------- + Wedding +-----------------------------------------------------------------*/ +.wedding-head .first-name, +.wedding-head .last-name, +.wedding-head .and { + margin-left: 15px; + margin-right: 0; + text-align: left; +} + +.wedding-head .last-name { + margin: 0 15px 0 0; + text-align: right; +} + +/* ---------------------------------------------------------------- + Styled Paginations +-----------------------------------------------------------------*/ +/* Pagination Margins */ +.pagination.pagination-circle .page-item:not(:first-child) .page-link, +.pagination.pagination-rounded .page-item:not(:first-child) .page-link { + margin-right: 5px; + margin-left: 0; +} + +.pagination.pagination-circle.pagination-lg + .page-item:not(:first-child) + .page-link, +.pagination.pagination-rounded.pagination-lg + .page-item:not(:first-child) + .page-link { + margin-right: 8px; + margin-left: 0; +} + +.pagination.pagination-circle.pagination-sm + .page-item:not(:first-child) + .page-link, +.pagination.pagination-rounded.pagination-sm + .page-item:not(:first-child) + .page-link { + margin-right: 3px; + margin-left: 0; +} + +/* Pagination Inside Transparent */ +.pagination.pagination-inside-transparent + .page-item:not(:first-child):not(:nth-child(2)):not(:nth-last-child(1)) + .page-link { + border-right: 0; +} + +/* Pagination Pill */ +.pagination.pagination-pill .page-item:first-child .page-link { + border-top-right-radius: 10rem; + border-top-left-radius: 0; + border-bottom-right-radius: 10rem; + border-bottom-left-radius: 0; +} + +.pagination.pagination-pill .page-item:last-child .page-link { + border-top-left-radius: 10rem; + border-bottom-left-radius: 10rem; + border-top-right-radius: 0; + border-bottom-left-radius: 0; +} + +/* -------------------------------------------------------------- + SWITCH +-------------------------------------------------------------- */ +.switch-toggle { + margin-right: -9999px; + margin-left: 0; +} + +/* -------------------------------------------------------------- + SWITCH 1 - ROUND +----------------------------------------------------------------- */ +input.switch-toggle-round + label::before, +input.switch-toggle-round + label::after { + right: 1px; + left: auto; +} + +input.switch-toggle-round + label::before { + left: 1px; + right: auto; +} + +input.switch-toggle-round:checked + label::after { + margin-right: 30px; + margin-left: 0; +} + +/* -------------------------------------------------------------- + SWITCH 1 - ROUND- MINI +----------------------------------------------------------------- */ +input.switch-rounded-mini.switch-toggle-round:checked + label::after { + margin-right: 15px; + margin-left: 0; +} + +/* -------------------------------------------------------------- + SWITCH 1 - ROUND- LARGE +----------------------------------------------------------------- */ +input.switch-rounded-large.switch-toggle-round:checked + label::after { + margin-right: 45px; + margin-left: 0; +} + +/* -------------------------------------------------------------- + SWITCH 1 - ROUND- XLARGE +----------------------------------------------------------------- */ +input.switch-rounded-xlarge.switch-toggle-round:checked + label::after { + margin-right: 60px; + margin-left: 0; +} + +/* ----------------------------------------------------------- + SWITCH 2 - ROUND FLAT +-------------------------------------------------------------- */ +input.switch-toggle-flat + label::after { + right: 4px; + left: auto; +} + +input.switch-toggle-flat:checked + label::after { + margin-right: 30px; + margin-left: 0; +} + +/* ----------------------------------------------------------- + SWITCH 2 - FLAT - MINI +-------------------------------------------------------------- */ +input.switch-flat-mini.switch-toggle-flat + label::after { + right: 2px; + left: auto; +} + +input.switch-flat-mini.switch-toggle-flat:checked + label::after { + margin-right: 16px; + margin-left: 0; +} + +/* ----------------------------------------------------------- + SWITCH 2 - FLAT - LARGE +-------------------------------------------------------------- */ +input.switch-flat-large.switch-toggle-flat:checked + label::after { + margin-right: 45px; + margin-left: 0; +} + +/* ----------------------------------------------------------- + SWITCH 2 - FLAT - XLARGE +-------------------------------------------------------------- */ +input.switch-flat-xlarge.switch-toggle-flat:checked + label::after { + margin-right: 60px; + margin-left: 0; +} + +/* ---------------------------------------------------------------- + Bootstrap Specific +-----------------------------------------------------------------*/ +.carousel-control .icon-chevron-left { + right: 50%; + left: auto; +} + +.carousel-control .icon-chevron-right { + left: 50%; + right: auto; +} + +label.radio, +label.checkbox { + padding-right: 20px; + padding-left: 0; +} + +/* ---------------------------------------------------------------- + Cookie Notification +-----------------------------------------------------------------*/ +#cookie-notification { + right: 0; + left: auto; +} + +#cookie-notification .container { + padding-left: 100px; + padding-right: 0; +} + +#cookie-notification .cookie-noti-btn { + right: auto; + left: 0; +} + +/* ---------------------------------------------------------------- + Page Transitions +-----------------------------------------------------------------*/ +.page-transition-wrap, +.css3-spinner, +.css3-spinner { + right: 0; + left: auto; +} + +.css3-spinner > div { + right: 50%; + left: auto; + margin-right: 13px; + margin-left: 0; +} + +.css3-spinner .css3-spinner-bounce1 { + margin-right: -31px; + margin-left: 0; +} + +.css3-spinner .css3-spinner-bounce2 { + margin-right: -9px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-flipper { + margin-right: -16px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-double-bounce1, +.css3-spinner > .css3-spinner-double-bounce2 { + margin-right: -20px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-rect1, +.css3-spinner > .css3-spinner-rect2, +.css3-spinner > .css3-spinner-rect3, +.css3-spinner > .css3-spinner-rect4, +.css3-spinner > .css3-spinner-rect5 { + margin-right: -21px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-rect2 { + margin-right: -12px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-rect3 { + margin-right: -3px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-rect4 { + margin-right: 6px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-rect5 { + margin-right: 15px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-cube1, +.css3-spinner > .css3-spinner-cube2 { + margin-right: -20px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-scaler { + margin-right: -20px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-grid-pulse { + margin-right: -24px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-clip-rotate { + margin-right: -17px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-ball-rotate { + margin-right: -6px; + margin-left: 0; +} + +.css3-spinner-ball-rotate > div:nth-child(1) { + right: -22px; + left: auto; +} + +.css3-spinner-ball-rotate > div:nth-child(3) { + right: 22px; + left: auto; +} + +.css3-spinner-zig-zag > div { + margin-right: 15px; + margin-left: 0; + right: -7px; + left: auto; +} + +.css3-spinner > .css3-spinner-ball-scale-multiple { + margin-right: -30px; + margin-left: auto; +} + +.css3-spinner-ball-scale-multiple > div { + right: 0; + left: auto; +} + +.css3-spinner-triangle-path > div:nth-of-type(2) { + right: 25px; + left: auto; +} + +.css3-spinner-triangle-path > div:nth-of-type(3) { + right: 50px; + left: auto; +} + +.css3-spinner > .css3-spinner-ball-pulse-sync { + margin-right: -35px; + margin-left: 0; +} + +.css3-spinner > .css3-spinner-scale-ripple { + margin-right: -25px; + margin-left: 0; +} + +/* ---------------------------------------------------------------- + HTML5 Youtube Video Backgrounds +-----------------------------------------------------------------*/ +.mb_YTVPlayer.fullscreen { + right: 0 !important; + left: auto; +} + +.inline_YTPlayer { + right: 0; + left: auto; +} diff --git a/fassets/style.css b/fassets/style.css new file mode 100644 index 0000000..33d7178 --- /dev/null +++ b/fassets/style.css @@ -0,0 +1,16794 @@ +/*----------------------------------------------------------------------------------- + + Theme Name: Canvas + Theme URI: http://themes.semicolonweb.com/html/canvas + Description: The Multi-Purpose Template + Author: SemiColonWeb + Author URI: http://themeforest.net/user/semicolonweb + Version: 6.5.2 + +-----------------------------------------------------------------------------------*/ + +/* ---------------------------------------------------------------- + + - Basic + - Typography + - Basic Layout Styles + - Helper Classes + - Sections + - Columns & Grids + - Flex Slider + - Swiper Slider + - Top Bar + - Header + - Logo + - Primary Menu + - Mega Menu + - Top Search + - Top Cart + - Sticky Header + - Page Menu + - Side Header + - Side Panel + - Slider + - Page Title + - Content + - Portfolio + - Blog + - Shop + - Events + - Shortcodes + - Countdown + - Buttons + - Promo Boxes + - Featured Boxes + - Process Steps + - Styled Icons + - Toggles + - Accordions + - Tabs + - Side Navigation + - FAQ List + - Clients + - Testimonials + - Team + - Pricing Boxes + - Counter + - Animated Rounded Skills + - Skills Bar + - Dropcaps & Highlights + - Quotes & Blockquotes + - Text Rotater + - Owl Carousel + - Overlays + - Forms + - Google Maps + - Heading Styles + - Divider + - Magazine Specific Classes + - Go To Top + - Error 404 + - Landing Pages + - Preloaders + - Footer + - Widgets + - Tag Cloud + - Links + - Testimonial & Twitter + - Quick Contact Form + - Newsletter + - Twitter Feed + - Navigation Tree + - Wedding + - Bootstrap Specific + - Cookie Notification + - Stretched Layout + - Page Transitions + - Youtube Video Backgrounds + +---------------------------------------------------------------- */ + + +/* ---------------------------------------------------------------- + Bootstrap Adjustments +-----------------------------------------------------------------*/ + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: auto; + } +} + +@media (min-width: 576px) { + .card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1.25rem; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns.grid-2 { + -webkit-column-count: 2; + -moz-column-count: 2; + column-count: 2; + } + .card-columns > * { + display: inline-block; + width: 100%; + } +} + +.form-group { + margin-bottom: 1rem; +} + + +/* ---------------------------------------------------------------- + Basic +-----------------------------------------------------------------*/ + +dl, dt, dd, ol, ul, li { + margin: 0; + padding: 0; +} + +.clear { + clear: both; + display: block; + font-size: 0px; + height: 0px; + line-height: 0; + width: 100%; + overflow:hidden; +} + +::selection { + background: #1ABC9C; + color: #FFF; + text-shadow: none; +} + +::-moz-selection { + background: #1ABC9C; /* Firefox */ + color: #FFF; + text-shadow: none; +} + +::-webkit-selection { + background: #1ABC9C; /* Safari */ + color: #FFF; + text-shadow: none; +} + +:active, +:focus { outline: none !important; } + + +/* ---------------------------------------------------------------- + Typography +-----------------------------------------------------------------*/ + + +body { + line-height: 1.5; + color: #555; + font-family: 'Lato', sans-serif; +} + +a { + text-decoration: none !important; + color: #1ABC9C; +} + +a:hover { color: #222; } + +a img { border: none; } + +img { max-width: 100%; } + +iframe { + width: 100%; + border: 0 !important; + overflow: hidden !important; +} + + +/* ---------------------------------------------------------------- + Basic Layout Styles +-----------------------------------------------------------------*/ + + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #444; + font-weight: 600; + line-height: 1.5; + margin: 0 0 30px 0; + font-family: 'Poppins', sans-serif; +} + +h5, +h6 { margin-bottom: 20px; } + +h1 { font-size: 36px; } + +h2 { font-size: 30px; } + +h3 { font-size: 1.5rem; } + +h4 { font-size: 18px; } + +h5 { font-size: 0.875rem; } + +h6 { font-size: 12px; } + +h4 { font-weight: 600; } + +h5, +h6 { font-weight: bold; } + +@media (max-width: 767.98px) { + + h1 { + font-size: 1.75rem; + } + + h2 { + font-size: 1.5rem; + } + + h3 { + font-size: 1.25rem; + } + + h4 { + font-size: 1rem; + } + +} + +h1 > span:not(.nocolor):not(.badge), +h2 > span:not(.nocolor):not(.badge), +h3 > span:not(.nocolor):not(.badge), +h4 > span:not(.nocolor):not(.badge), +h5 > span:not(.nocolor):not(.badge), +h6 > span:not(.nocolor):not(.badge) { color: #1ABC9C; } + +p, +pre, +ul, +ol, +dl, +dd, +blockquote, +address, +table, +fieldset, +form { margin-bottom: 30px; } + +small { font-family: 'Lato', sans-serif; } + + +@media (max-width: 1200px) { + .display-1 { + font-size: calc( 1.725rem + 5.7vw ); + } + .display-2 { + font-size: calc( 1.675rem + 5.1vw ); + } + .display-3 { + font-size: calc( 1.575rem + 3.9vw ); + } + .display-4 { + font-size: calc( 1.475rem + 2.7vw ); + } +} + + +/* ---------------------------------------------------------------- + Helper Classes +-----------------------------------------------------------------*/ + +#wrapper { + position: relative; + float: none; + width: 100%; + margin: 0 auto; + background-color: #FFF; + box-shadow: 0 0 10px rgba(0,0,0,0.1); + -moz-box-shadow: 0 0 10px rgba(0,0,0,0.1); + -webkit-box-shadow: 0 0 10px rgba(0,0,0,0.1); +} + +@media (min-width: 1200px) { + body:not(.stretched) #wrapper { + max-width: 1200px; + } +} + +@media (min-width: 1440px) { + body:not(.stretched) #wrapper { + max-width: 1440px; + } +} + +.line, +.double-line { + clear: both; + position: relative; + width: 100%; + margin: 4rem 0; + border-top: 1px solid #EEE; +} + +.line.line-sm { margin: 2rem 0; } + +span.middot { + display: inline-block; + margin: 0 5px; +} + +.double-line { border-top: 3px double #E5E5E5; } + +.nott { text-transform: none !important; } + +.emptydiv { + display: block !important; + position: relative !important; +} + +.allmargin { margin: 3rem !important; } + +.leftmargin { margin-left: 3rem !important; } + +.rightmargin { margin-right: 3rem !important; } + +.topmargin { margin-top: 3rem !important; } + +.bottommargin { margin-bottom: 3rem !important; } + +.allmargin-sm { margin: 2rem !important; } + +.leftmargin-sm { margin-left: 2rem !important; } + +.rightmargin-sm { margin-right: 2rem !important; } + +.topmargin-sm { margin-top: 2rem !important; } + +.bottommargin-sm { margin-bottom: 2rem !important; } + +.allmargin-lg { margin: 5rem !important; } + +.leftmargin-lg { margin-left: 5rem !important; } + +.rightmargin-lg { margin-right: 5rem !important; } + +.topmargin-lg { margin-top: 5rem !important; } + +.bottommargin-lg { margin-bottom: 5rem !important; } + +.header-stick { margin-top: -3rem !important; } + +.content-wrap .header-stick { margin-top: -5rem !important; } + +.footer-stick { margin-bottom: -3rem !important; } + +.content-wrap .footer-stick { margin-bottom: -5rem !important; } + +.border-f5 { border-color: #F5F5F5 !important; } + +.col-padding { padding: 4rem; } + +.notextshadow { text-shadow: none !important; } + +.inline-block { + float: none !important; + display: inline-block !important; +} + +.center { text-align: center !important; } + +.mx-auto { + float: none !important; +} + +.bg-color, +.bg-color #header-wrap { background-color: #1ABC9C !important; } + +.color { color: #1ABC9C !important; } + +.border-color { border-color: #1ABC9C !important; } + +.ls0 { letter-spacing: 0px !important; } + +.ls1 { letter-spacing: 1px !important; } + +.ls2 { letter-spacing: 2px !important; } + +.ls3 { letter-spacing: 3px !important; } + +.ls4 { letter-spacing: 4px !important; } + +.ls5 { letter-spacing: 5px !important; } + +.noheight { height: 0 !important; } + +.nolineheight { line-height: 0 !important; } + +.font-body { font-family: 'Lato', sans-serif; } + +.font-primary { font-family: 'Poppins', sans-serif; } + +.font-secondary { font-family: 'PT Serif', serif; } + +.fw-extralight { + font-weight: 100 !important; +} + +.fw-medium { + font-weight: 500 !important; +} + +.fw-semibold { + font-weight: 600 !important; +} + +.fst-normal { + font-style: normal !important; +} + +.bgicon { + display: block; + position: absolute; + bottom: -60px; + right: -50px; + font-size: 210px; + color: rgba(0,0,0,0.1); +} + +.imagescale, +.imagescalein { + display: block; + overflow: hidden; +} + +.imagescale img, +.imagescalein img { + -webkit-transform: scale(1.1); + transform: scale(1.1); + -webkit-transition: all 1s ease; + transition: all 1s ease; +} + +.imagescale:hover img { + -webkit-transform: scale(1); + transform: scale(1); +} + +.imagescalein img { + -webkit-transform: scale(1); + transform: scale(1); +} + +.imagescalein:hover img { + -webkit-transform: scale(1.1); + transform: scale(1.1); +} + +.grayscale { + filter: brightness(80%) grayscale(1) contrast(90%); + -webkit-filter: brightness(80%) grayscale(1) contrast(90%); + -moz-filter: brightness(80%) grayscale(1) contrast(90%); + -o-filter: brightness(80%) grayscale(1) contrast(90%); + -ms-filter: brightness(80%) grayscale(1) contrast(90%); + transition: 1s filter ease; + -webkit-transition: 1s -webkit-filter ease; + -moz-transition: 1s -moz-filter ease; + -ms-transition: 1s -ms-filter ease; + -o-transition: 1s -o-filter ease; +} + +.grayscale:hover { + filter: brightness(100%) grayscale(0); + -webkit-filter: brightness(100%) grayscale(0); + -moz-filter: brightness(100%) grayscale(0); + -o-filter: brightness(100%) grayscale(0); + -ms-filter: brightness(100%) grayscale(0); +} + +/* MOVING BG - TESTIMONIALS */ +.bganimate { + -webkit-animation:BgAnimated 30s infinite linear; + -moz-animation:BgAnimated 30s infinite linear; + -ms-animation:BgAnimated 30s infinite linear; + -o-animation:BgAnimated 30s infinite linear; + animation:BgAnimated 30s infinite linear; +} + @-webkit-keyframes BgAnimated { + from {background-position:0 0;} + to {background-position:0 400px;} + } + @-moz-keyframes BgAnimated { + from {background-position:0 0;} + to {background-position:0 400px;} + } + @-ms-keyframes BgAnimated { + from {background-position:0 0;} + to {background-position:0 400px;} + } + @-o-keyframes BgAnimated { + from {background-position:0 0;} + to {background-position:0 400px;} + } + @keyframes BgAnimated { + from {background-position:0 0;} + to {background-position:0 400px;} + } + + +.input-block-level { + display: block; + width: 100% !important; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.vertical-middle { + z-index: 3; + position: relative; + display: -ms-flexbox; + display: flex; + width: 100%; + min-height: 100%; + justify-content: center; + flex-flow: column; +} + +.vertical-middle-overlay { + position: absolute; + top: 0; + left: 0; +} + +.vertical-middle + .video-wrap { z-index: 2 !important; } + +.magnific-max-width .mfp-content { max-width: 800px; } + +.overflow-visible { + overflow: visible !important; +} + + +/* ---------------------------------------------------------------- + Opacity Utility Classes +-----------------------------------------------------------------*/ + +.op-ts { + -webkit-transition: opacity .5s ease; + transition: opacity .5s ease; +} + +.op-0, +.h-op-0:hover { + opacity: 0 !important; +} + +.op-01, +.h-op-01:hover { + opacity: 0.1 !important; +} + +.op-02, +.h-op-02:hover { + opacity: 0.2 !important; +} + +.op-03, +.h-op-03:hover { + opacity: 0.3 !important; +} + +.op-04, +.h-op-04:hover { + opacity: 0.4 !important; +} + +.op-05, +.h-op-05:hover { + opacity: 0.5 !important; +} + +.op-06, +.h-op-06:hover { + opacity: 0.6 !important; +} + +.op-07, +.h-op-07:hover { + opacity: 0.7 !important; +} + +.op-08, +.h-op-08:hover { + opacity: 0.8 !important; +} + +.op-09, +.h-op-09:hover { + opacity: 0.9 !important; +} + +.op-1, +.h-op-1:hover { + opacity: 1 !important; +} + + +/* ---------------------------------------------------------------- + Text Color Utility Classes +-----------------------------------------------------------------*/ + +.text-ts { + -webkit-transition: color .5s ease; + transition: color .5s ease; +} + +.h-text-color:hover, +a.h-text-color:hover { + color: #1ABC9C !important; +} + +.h-text-primary:hover, +a.h-text-primary:hover { + color: #007bff !important; +} + +.h-text-secondary:hover, +a.h-text-secondary:hover { + color: #6c757d !important; +} + +.h-text-success:hover, +a.h-text-success:hover { + color: #28a745 !important; +} + +.h-text-info:hover, +a.h-text-info:hover { + color: #17a2b8 !important; +} + +.h-text-warning:hover, +a.h-text-warning:hover { + color: #ffc107 !important; +} + +.h-text-danger:hover, +a.h-text-danger:hover { + color: #dc3545 !important; +} + +.h-text-light:hover, +a.h-text-light:hover { + color: #f8f9fa !important; +} + +.h-text-dark:hover, +a.h-text-dark:hover { + color: #343a40 !important; +} + + +/* ---------------------------------------------------------------- + Text Size Utility Classes +-----------------------------------------------------------------*/ + +.text-smaller { + font-size: 80% !important; +} + +.text-larger { + font-size: 120% !important; +} + +.text-smaller small { + font-size: 90% !important; +} + + +/* ---------------------------------------------------------------- + BG Color Utility Classes +-----------------------------------------------------------------*/ + +.bg-ts { + -webkit-transition: background-color .5s ease; + transition: background-color .5s ease; +} + +.h-nobg:hover { + background-color: transparent !important; +} + +.h-bg-color:hover { + background-color: #1ABC9C !important; +} + +.h-bg-primary:hover { + background-color: #007bff !important; +} + +.h-bg-secondary:hover { + background-color: #6c757d !important; +} + +.h-bg-success:hover { + background-color: #28a745 !important; +} + +.h-bg-info:hover { + background-color: #17a2b8 !important; +} + +.h-bg-warning:hover { + background-color: #ffc107 !important; +} + +.h-bg-danger:hover { + background-color: #dc3545 !important; +} + +.h-bg-light:hover { + background-color: #f8f9fa !important; +} + +.h-bg-dark:hover { + background-color: #343a40 !important; +} + + +.bg-clip { + border: 1rem solid transparent; + -moz-background-clip: padding; + -webkit-background-clip: padding; + background-clip: padding-box; + transform: translate3d(0,0,0); +} + +.bg-clip-sm { + border-width: 0.5rem; +} + +.bg-clip-lg { + border-width: 2rem; +} + + +/* ---------------------------------------------------------------- + Gradient Utility Classes +-----------------------------------------------------------------*/ + +.gradient-light-grey, +.h-gradient-light-grey:hover { + background-image: -webkit-linear-gradient(to right, #2c3e50, #bdc3c7) !important; + background-image: linear-gradient(to right, #2c3e50, #bdc3c7) !important; +} + +.gradient-green-dark, +.h-gradient-green-dark:hover { + background-image: -webkit-linear-gradient(to right, #99f2c8, #1f4037) !important; + background-image: linear-gradient(to right, #99f2c8, #1f4037) !important; +} + +.gradient-grey-brown, +.h-gradient-grey-brown:hover { + background-image: -webkit-linear-gradient(to right, #C06C84, #6C5B7B, #355C7D) !important; + background-image: linear-gradient(to right, #C06C84, #6C5B7B, #355C7D) !important; +} + +.gradient-light-pink, +.h-gradient-light-pink:hover { + background-image: -webkit-linear-gradient(to right, #ffdde1, #ee9ca7) !important; + background-image: linear-gradient(to right, #ffdde1, #ee9ca7) !important; +} + +.gradient-blue-purple, +.h-gradient-blue-purple:hover { + background-image: -webkit-linear-gradient(to right, #4A00E0, #8E2DE2) !important; + background-image: linear-gradient(to right, #4A00E0, #8E2DE2) !important; +} +.gradient-multiples, +.h-gradient-multiples:hover { + background-image: -webkit-linear-gradient(to right, #eea2a2 0%, #bbc1bf 19%, #57c6e1 42%, #b49fda 79%, #7ac5d8 100%) !important; + background-image: linear-gradient(to right, #eea2a2 0%, #bbc1bf 19%, #57c6e1 42%, #b49fda 79%, #7ac5d8 100%) !important; +} + +.gradient-blue-green, +.h-gradient-blue-green:hover { + background-image: -webkit-linear-gradient(to right, #2af598 0%, #009efd 100%) !important; + background-image: linear-gradient(to right, #2af598 0%, #009efd 100%) !important; +} + +.gradient-light, +.h-gradient-light:hover { + background-image: -webkit-linear-gradient(to top, #DDD 0%, #FFF 100%) !important; + background-image: linear-gradient(to top, #DDD 0%, #FFF 100%) !important; +} + +.gradient-grey-orange, +.h-gradient-grey-orange:hover { + background-image: -webkit-linear-gradient(to right, #3B4371, #F3904F) !important; + background-image: linear-gradient(to right, #3B4371, #F3904F) !important; +} + +.gradient-sunset, +.h-gradient-sunset:hover { + background-image: -webkit-linear-gradient(to top, #a8edea 0%, #fed6e3 100%) !important; + background-image: linear-gradient(to top, #a8edea 0%, #fed6e3 100%) !important; +} + +.gradient-dark, +.h-gradient-dark:hover { + background-image: -webkit-linear-gradient(to right, #535353, #000) !important; + background-image: linear-gradient(to right, #535353, #000) !important; +} + +.gradient-lemon, +.h-gradient-lemon:hover { + background-image: -webkit-linear-gradient(to right, #cac531, #f3f9a7) !important; + background-image: linear-gradient(to right, #cac531, #f3f9a7) !important; +} + +.gradient-earth, +.h-gradient-earth:hover { + background-image: -webkit-linear-gradient(to right, #649173, #dbd5a4) !important; + background-image: linear-gradient(to right, #649173, #dbd5a4) !important; +} + +.gradient-sky, +.h-gradient-sky:hover { + background-image: -webkit-linear-gradient(to right, #2980b9, #6dd5fa, #F5F5F5) !important; + background-image: linear-gradient(to right, #2980b9, #6dd5fa, #F5F5F5) !important; +} + +.gradient-ocean, +.h-gradient-ocean:hover { + background-image: -webkit-linear-gradient(to right, #000046, #1cb5e0) !important; + background-image: linear-gradient(to right, #000046, #1cb5e0) !important; +} + +.gradient-horizon, +.h-gradient-horizon:hover { + background-image: -webkit-linear-gradient(90deg, rgba(131,58,180,1) 0%, rgba(253,29,29,1) 50%, rgba(252,176,69,1) 100%) !important; + background-image: linear-gradient(90deg, rgba(131,58,180,1) 0%, rgba(253,29,29,1) 50%, rgba(252,176,69,1) 100%) !important; +} + +.gradient-green-blue, +.h-gradient-green-blue:hover { + background-image: -webkit-linear-gradient(to right, #43cea2, #185a9d) !important; + background-image: linear-gradient(to right, #43cea2, #185a9d) !important; +} + +.gradient-purple-blue, +.h-gradient-purple-blue:hover { + background-image: -webkit-linear-gradient(19deg, rgb(33, 212, 253) 0%, rgb(183, 33, 255) 100%) !important; + background-image: linear-gradient(19deg, rgb(33, 212, 253) 0%, rgb(183, 33, 255) 100%) !important; +} + +.gradient-text { + text-shadow: none !important; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.gradient-underline { + background-repeat: no-repeat; + background-size: 100% 8px; + background-position: 0 88%; +} + + +/* ---------------------------------------------------------------- + Border Utility Classes +-----------------------------------------------------------------*/ + +.border-width-0, +.h-border-width-0:hover { + border-width: 0px !important; +} + +.border-width-1, +.h-border-width-1:hover { + border-width: 1px !important; +} + +.border-width-2, +.h-border-width-2:hover { + border-width: 2px !important; +} + +.border-width-3, +.h-border-width-3:hover { + border-width: 3px !important; +} + +.border-width-4, +.h-border-width-4:hover { + border-width: 4px !important; +} + +.border-width-5, +.h-border-width-5:hover { + border-width: 5px !important; +} + +.border-width-6, +.h-border-width-6:hover { + border-width: 6px !important; +} + +.border-dotted { + border-style: dotted !important; +} + +.border-dashed { + border-style: dashed !important; +} + +.border-solid { + border-style: solid !important; +} + +.border-double { + border-style: double !important; +} + +.h-border-primary:hover { + border-color: #007bff !important; +} + +.h-border-secondary:hover { + border-color: #6c757d !important; +} + +.h-border-success:hover { + border-color: #28a745 !important; +} + +.h-border-info:hover { + border-color: #17a2b8 !important; +} + +.h-border-warning:hover { + border-color: #ffc107 !important; +} + +.h-border-danger:hover { + border-color: #dc3545 !important; +} + +.h-border-light:hover { + border-color: #f8f9fa !important; +} + +.h-border-dark:hover { + border-color: #343a40 !important; +} + +.border-transparent, +.h-border-transparent:hover { + border-color: transparent !important; +} + +.border-default, +.h-border-default:hover { + border-color: #EEE !important; +} + +.dark.border-default, +.dark .border-default, +.dark.h-border-default:hover +.dark .h-border-default:hover { + border-color: rgba(255, 255, 255, 0.15) !important; +} + +.border-ts { + -webkit-transition: border 0.5s ease; + transition: border 0.5s ease; +} + + +/* ---------------------------------------------------------------- + Rounded +-----------------------------------------------------------------*/ + +.rounded-4 { + border-radius: 0.4rem !important; +} + +.rounded-5 { + border-radius: 0.5rem !important; +} + +.rounded-6 { + border-radius: 0.6rem !important; +} + + +/* ---------------------------------------------------------------- + Shadows +-----------------------------------------------------------------*/ + +.h-shadow-sm:hover { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.h-shadow:hover { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.h-shadow-lg:hover { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.h-shadow-none:hover { + box-shadow: none !important; +} + +.shadow-ts { + -webkit-transition: box-shadow 0.5s ease; + transition: box-shadow 0.5s ease; +} + + +/* ---------------------------------------------------------------- + Transform Utility Classes +-----------------------------------------------------------------*/ + +.translate-y-sm, +.h-translate-y-sm:hover { + transform: translateY(-3px) !important; +} + +.translate-y, +.h-translate-y:hover { + transform: translateY(-6px) !important; +} + +.translate-y-lg, +.h-translate-y-lg:hover { + transform: translateY(-10px) !important; +} + +.translate-x-sm, +.h-translate-x-sm:hover { + transform: translateX(-3px) !important; +} + +.translate-x, +.h-translate-x:hover { + transform: translateX(-6px) !important; +} + +.translate-x-lg, +.h-translate-x-lg:hover { + transform: translateX(-10px) !important; +} + +.translate-x-n-sm, +.h-translate-x-n-sm:hover { + transform: translateX(3px) !important; +} + +.translate-x-n, +.h-translate-x-n:hover { + transform: translateX(6px) !important; +} + +.translate-x-n-lg, +.h-translate-x-n-lg:hover { + transform: translateX(10px) !important; +} + +.scale-sm, +.h-scale-sm:hover { + transform: scale(1.025) !important; +} + +.scale, +.h-scale:hover { + transform: scale(1.05) !important; +} + +.scale-lg, +.h-scale-lg:hover { + transform: scale(1.1) !important; +} + +.scale-n-sm, +.h-scale-n-sm:hover { + transform: scale(0.975) !important; +} + +.scale-n, +.h-scale-n:hover { + transform: scale(0.95) !important; +} + +.scale-n-lg, +.h-scale-n-lg:hover { + transform: scale(0.9) !important; +} + +.transform-ts { + -webkit-transition: transform 0.5s cubic-bezier(.215, .61, .355, 1); + transition: transform 0.5s cubic-bezier(.215, .61, .355, 1); +} + +.all-ts { + -webkit-transition: all 0.5s cubic-bezier(.215, .61, .355, 1); + transition: all 0.5s cubic-bezier(.215, .61, .355, 1); +} + + +/* ---------------------------------------------------------------- + Align Wide Utility Classes +-----------------------------------------------------------------*/ + +.align-wide-lg { + margin-left: calc(50% - 480px) !important; + margin-right: calc(50% - 480px) !important; + max-width: 960px !important; + width: 960px !important; +} + +.align-wide-xl { + margin-left: calc(50% - 570px) !important; + margin-right: calc(50% - 570px) !important; + max-width: 1140px !important; + width: 1140px !important; +} + +.align-wide-xxl { + margin-left: calc(50% - 660px) !important; + margin-right: calc(50% - 660px) !important; + max-width: 1320px !important; + width: 1320px !important; +} + +@media (max-width: 991.98px) { + .align-wide-lg, + .align-wide-xl, + .align-wide-xxl { + margin-left: calc(50% - 50vw) !important; + margin-right: calc(50% - 50vw) !important; + max-width: 100vw !important; + width: 100vw !important; + } +} + +.align-wide-full { + margin-left: calc(50% - 50vw) !important; + margin-right: calc(50% - 50vw) !important; + max-width: 100vw !important; + width: 100vw !important; +} + + +/* ---------------------------------------------------------------- + Z-Index Utility Classes +-----------------------------------------------------------------*/ + +.z-1 { + z-index: 1 !important; +} + +.z-2 { + z-index: 2 !important; +} + +.z-3 { + z-index: 3 !important; +} + +.z-4 { + z-index: 4 !important; +} + +.z-5 { + z-index: 5 !important; +} + +.z-6 { + z-index: 6 !important; +} + +.z-7 { + z-index: 7 !important; +} + +.z-8 { + z-index: 8 !important; +} + +.z-9 { + z-index: 9 !important; +} + +.z-10 { + z-index: 10 !important; +} + +.z-auto { + z-index: auto !important; +} + + +/* ---------------------------------------------------------------- + Bootstrap Utility Classes: Extended +-----------------------------------------------------------------*/ + + +/* Spacing Utilities */ + +.m-6 { + margin: 5rem !important; +} + +.mt-6, +.my-6 { + margin-top: 5rem !important; +} + +.me-6, +.mx-6 { + margin-right: 5rem !important; +} + +.mb-6, +.my-6 { + margin-bottom: 5rem !important; +} + +.ms-6, +.mx-6 { + margin-left: 5rem !important; +} + +.p-6 { + padding: 5rem !important; +} + +.pt-6, +.py-6 { + padding-top: 5rem !important; +} + +.pe-6, +.px-6 { + padding-right: 5rem !important; +} + +.pb-6, +.py-6 { + padding-bottom: 5rem !important; +} + +.ps-6, +.px-6 { + padding-left: 5rem !important; +} + +@media (min-width: 576px) { + + .m-sm-6 { + margin: 5rem !important; + } + + .mt-sm-6, + .my-sm-6 { + margin-top: 5rem !important; + } + + .me-sm-6, + .mx-sm-6 { + margin-right: 5rem !important; + } + + .mb-sm-6, + .my-sm-6 { + margin-bottom: 5rem !important; + } + + .ms-sm-6, + .mx-sm-6 { + margin-left: 5rem !important; + } + + .p-sm-6 { + padding: 5rem !important; + } + + .pt-sm-6, + .py-sm-6 { + padding-top: 5rem !important; + } + + .pe-sm-6, + .px-sm-6 { + padding-right: 5rem !important; + } + + .pb-sm-6, + .py-sm-6 { + padding-bottom: 5rem !important; + } + + .ps-sm-6, + .px-sm-6 { + padding-left: 5rem !important; + } + +} + +@media (min-width: 768px) { + + .m-md-6 { + margin: 5rem !important; + } + + .mt-md-6, + .my-md-6 { + margin-top: 5rem !important; + } + + .me-md-6, + .mx-md-6 { + margin-right: 5rem !important; + } + + .mb-md-6, + .my-md-6 { + margin-bottom: 5rem !important; + } + + .ms-md-6, + .mx-md-6 { + margin-left: 5rem !important; + } + + .p-md-6 { + padding: 5rem !important; + } + + .pt-md-6, + .py-md-6 { + padding-top: 5rem !important; + } + + .pe-md-6, + .px-md-6 { + padding-right: 5rem !important; + } + + .pb-md-6, + .py-md-6 { + padding-bottom: 5rem !important; + } + + .ps-md-6, + .px-md-6 { + padding-left: 5rem !important; + } + +} + +@media (min-width: 992px) { + + .m-lg-6 { + margin: 5rem !important; + } + + .mt-lg-6, + .my-lg-6 { + margin-top: 5rem !important; + } + + .me-lg-6, + .mx-lg-6 { + margin-right: 5rem !important; + } + + .mb-lg-6, + .my-lg-6 { + margin-bottom: 5rem !important; + } + + .ms-lg-6, + .mx-lg-6 { + margin-left: 5rem !important; + } + + .p-lg-6 { + padding: 5rem !important; + } + + .pt-lg-6, + .py-lg-6 { + padding-top: 5rem !important; + } + + .pe-lg-6, + .px-lg-6 { + padding-right: 5rem !important; + } + + .pb-lg-6, + .py-lg-6 { + padding-bottom: 5rem !important; + } + + .ps-lg-6, + .px-lg-6 { + padding-left: 5rem !important; + } + +} + +@media (min-width: 1200px) { + + .m-xl-6 { + margin: 5rem !important; + } + + .mt-xl-6, + .my-xl-6 { + margin-top: 5rem !important; + } + + .me-xl-6, + .mx-xl-6 { + margin-right: 5rem !important; + } + + .mb-xl-6, + .my-xl-6 { + margin-bottom: 5rem !important; + } + + .ms-xl-6, + .mx-xl-6 { + margin-left: 5rem !important; + } + + .p-xl-6 { + padding: 5rem !important; + } + + .pt-xl-6, + .py-xl-6 { + padding-top: 5rem !important; + } + + .pe-xl-6, + .px-xl-6 { + padding-right: 5rem !important; + } + + .pb-xl-6, + .py-xl-6 { + padding-bottom: 5rem !important; + } + + .ps-xl-6, + .px-xl-6 { + padding-left: 5rem !important; + } + +} + + +@media (min-width: 1400px) { + + .m-xxl-6 { + margin: 5rem !important; + } + + .mt-xxl-6, + .my-xxl-6 { + margin-top: 5rem !important; + } + + .me-xxl-6, + .mx-xxl-6 { + margin-right: 5rem !important; + } + + .mb-xxl-6, + .my-xxl-6 { + margin-bottom: 5rem !important; + } + + .ms-xxl-6, + .mx-xxl-6 { + margin-left: 5rem !important; + } + + .p-xxl-6 { + padding: 5rem !important; + } + + .pt-xxl-6, + .py-xxl-6 { + padding-top: 5rem !important; + } + + .pe-xxl-6, + .px-xxl-6 { + padding-right: 5rem !important; + } + + .pb-xxl-6, + .py-xxl-6 { + padding-bottom: 5rem !important; + } + + .ps-xxl-6, + .px-xxl-6 { + padding-left: 5rem !important; + } + +} + + +/* Custom Bootstrap Column */ + +[class*="col-"]:not([class*="sticky-"]):not([class*="position-"]) { + position: relative; +} + +.col-1-5 { + flex: 0 0 auto; + width: 20%; +} + +@media (min-width: 576px) { + .col-sm-1-5 { + flex: 0 0 auto; + width: 20%; + } +} + +@media (min-width: 768px) { + .col-md-1-5 { + flex: 0 0 auto; + width: 20%; + } +} + +@media (min-width: 992px) { + .col-lg-1-5 { + flex: 0 0 auto; + width: 20%; + } +} + +@media (min-width: 1200px) { + .col-xl-1-5 { + flex: 0 0 auto; + width: 20%; + } +} + +@media (min-width: 1400px) { + .col-xxl-1-5 { + flex: 0 0 auto; + width: 20%; + } +} + + +/* Gutters */ +[class*="gutter-"] { + --custom-gutter: var(--bs-gutter-x); /* Default Bootstrap */ + margin-right: calc(var(--custom-gutter) / -2); + margin-left: calc(var(--custom-gutter) / -2); + margin-top: calc(var(--custom-gutter) * -1); +} + +[class*="gutter-"] > .col, +[class*="gutter-"] > [class*="col-"] { + padding-right: calc(var(--custom-gutter) / 2); + padding-left: calc(var(--custom-gutter) / 2); + margin-top: var(--custom-gutter); +} + +.gutter-10 { + --custom-gutter: 10px; +} + +.gutter-20 { + --custom-gutter: 20px; +} + +.gutter-30 { + --custom-gutter: 30px; +} + +.gutter-40 { + --custom-gutter: 40px; +} + +.gutter-50 { + --custom-gutter: 50px; +} + +[class*="col-mb-"] { + margin-bottom: calc(var(--col-mb) / -1); +} + +[class*="col-mb-"] > .col, +[class*="col-mb-"] > [class*="col-"] { + padding-bottom: var(--col-mb); +} + +.col-mb-30 { + --col-mb: 30px; +} + +.col-mb-50 { + --col-mb: 50px; +} + +.col-mb-80 { + --col-mb: 80px; +} + +@media (min-width: 576px) { + .gutter-sm-10 { + --custom-gutter: 10px; + } + + .gutter-sm-20 { + --custom-gutter: 20px; + } + + .gutter-sm-30 { + --custom-gutter: 30px; + } + + .gutter-sm-40 { + --custom-gutter: 40px; + } + + .gutter-sm-50 { + --custom-gutter: 50px; + } + + .col-mb-sm-30 { + --col-mb: 30px; + } + + .col-mb-sm-50 { + --col-mb: 50px; + } + + .col-mb-sm-80 { + --col-mb: 80px; + } +} + +@media (min-width: 768px) { + .gutter-md-10 { + --custom-gutter: 10px; + } + + .gutter-md-20 { + --custom-gutter: 20px; + } + + .gutter-md-30 { + --custom-gutter: 30px; + } + + .gutter-md-40 { + --custom-gutter: 40px; + } + + .gutter-md-50 { + --custom-gutter: 50px; + } + + .col-mb-md-30 { + --col-mb: 30px; + } + + .col-mb-md-50 { + --col-mb: 50px; + } + + .col-mb-md-80 { + --col-mb: 80px; + } +} + +@media (min-width: 992px) { + .gutter-lg-10 { + --custom-gutter: 10px; + } + + .gutter-lg-20 { + --custom-gutter: 20px; + } + + .gutter-lg-30 { + --custom-gutter: 30px; + } + .gutter-lg-40 { + --custom-gutter: 40px; + } + .gutter-lg-50 { + --custom-gutter: 50px; + } + + .col-mb-lg-30 { + --col-mb: 30px; + } + + .col-mb-lg-50 { + --col-mb: 50px; + } + + .col-mb-lg-80 { + --col-mb: 80px; + } +} + +@media (min-width: 1200px) { + .gutter-xl-10 { + --custom-gutter: 10px; + } + + .gutter-xl-20 { + --custom-gutter: 20px; + } + + .gutter-xl-30 { + --custom-gutter: 30px; + } + .gutter-xl-40 { + --custom-gutter: 40px; + } + .gutter-xl-50 { + --custom-gutter: 50px; + } + + .col-mb-xl-30 { + --col-mb: 30px; + } + + .col-mb-xl-50 { + --col-mb: 50px; + } + + .col-mb-xl-80 { + --col-mb: 80px; + } +} + +@media (min-width: 1400px) { + .gutter-xxl-10 { + --custom-gutter: 10px; + } + + .gutter-xxl-20 { + --custom-gutter: 20px; + } + + .gutter-xxl-30 { + --custom-gutter: 30px; + } + .gutter-xxl-40 { + --custom-gutter: 40px; + } + .gutter-xxl-50 { + --custom-gutter: 50px; + } + + .col-mb-xxl-30 { + --col-mb: 30px; + } + + .col-mb-xxl-50 { + --col-mb: 50px; + } + + .col-mb-xxl-80 { + --col-mb: 80px; + } +} + + +/* ---------------------------------------------------------------- + Max Width Utility Classes +-----------------------------------------------------------------*/ + +.mw-xs { + max-width: 36rem !important; +} + +.mw-sm { + max-width: 48rem !important; +} + +.mw-md { + max-width: 64rem !important; +} + +.mw-lg { + max-width: 78rem !important; +} + +.mw-xl { + max-width: 88rem !important; +} + +.mw-xxl { + max-width: 100rem !important; +} + + +/* ---------------------------------------------------------------- + Height Utility Classes +-----------------------------------------------------------------*/ + +.min-vh-75 { + min-height: 75vh !important; +} + +.min-vh-60 { + min-height: 60vh !important; +} + +.min-vh-50 { + min-height: 50vh !important; +} + +.min-vh-40 { + min-height: 40vh !important; +} + +.min-vh-25 { + min-height: 25vh !important; +} + +.min-vh-0 { + min-height: 0 !important; +} + +.vh-75 { + height: 75vh !important; +} + +.vh-60 { + height: 60vh !important; +} + +.vh-50 { + height: 50vh !important; +} + +.vh-40 { + height: 40vh !important; +} + +.vh-25 { + height: 25vh !important; +} + +.h-60 { + height: 60% !important; +} + +.h-40 { + height: 40% !important; +} + +.max-vh-100 { + max-height: 100vh !important; +} + +.max-vh-75 { + max-height: 75vh !important; +} + +.max-vh-60 { + max-height: 60vh !important; +} + +.max-vh-50 { + max-height: 50vh !important; +} + +.max-vh-40 { + max-height: 40vh !important; +} + +.max-vh-25 { + max-height: 25vh !important; +} + +.max-vh-none { + max-height: none !important; +} + +@media (min-width: 576px) { + .min-vh-sm-100 { + min-height: 100vh !important; + } + + .min-vh-sm-75 { + min-height: 75vh !important; + } + + .min-vh-sm-60 { + min-height: 60vh !important; + } + + .min-vh-sm-50 { + min-height: 50vh !important; + } + + .min-vh-sm-40 { + min-height: 40vh !important; + } + + .min-vh-sm-25 { + min-height: 25vh !important; + } + + .min-vh-sm-0 { + min-height: 0 !important; + } + + .vh-sm-100 { + height: 100vh !important; + } + + .vh-sm-75 { + height: 75vh !important; + } + + .vh-sm-60 { + height: 60vh !important; + } + + .vh-sm-50 { + height: 50vh !important; + } + + .vh-sm-40 { + height: 40vh !important; + } + + .vh-sm-25 { + height: 25vh !important; + } + + .h-sm-100 { + height: 100% !important; + } + + .h-sm-75 { + height: 75% !important; + } + + .h-sm-60 { + height: 60% !important; + } + + .h-sm-50 { + height: 50% !important; + } + + .h-sm-40 { + height: 40% !important; + } + + .h-sm-25 { + height: 25% !important; + } + + .h-sm-auto { + height: auto !important; + } + + .max-vh-sm-100 { + max-height: 100vh !important; + } + + .max-vh-sm-75 { + max-height: 75vh !important; + } + + .max-vh-sm-60 { + max-height: 60vh !important; + } + + .max-vh-sm-50 { + max-height: 50vh !important; + } + + .max-vh-sm-40 { + max-height: 40vh !important; + } + + .max-vh-sm-25 { + max-height: 25vh !important; + } + + .max-vh-sm-none { + max-height: none !important; + } +} + +@media (min-width: 768px) { + .min-vh-md-100 { + min-height: 100vh !important; + } + + .min-vh-md-75 { + min-height: 75vh !important; + } + + .min-vh-md-60 { + min-height: 60vh !important; + } + + .min-vh-md-50 { + min-height: 50vh !important; + } + + .min-vh-md-40 { + min-height: 40vh !important; + } + + .min-vh-md-25 { + min-height: 25vh !important; + } + + .min-vh-md-0 { + min-height: 0 !important; + } + + .vh-md-100 { + height: 100vh !important; + } + + .vh-md-75 { + height: 75vh !important; + } + + .vh-md-60 { + height: 60vh !important; + } + + .vh-md-50 { + height: 50vh !important; + } + + .vh-md-40 { + height: 40vh !important; + } + + .vh-md-25 { + height: 25vh !important; + } + + .h-md-100 { + height: 100% !important; + } + + .h-md-75 { + height: 75% !important; + } + + .h-md-60 { + height: 60% !important; + } + + .h-md-50 { + height: 50% !important; + } + + .h-md-40 { + height: 40% !important; + } + + .h-md-25 { + height: 25% !important; + } + + .h-md-auto { + height: auto !important; + } + + .max-vh-md-100 { + max-height: 100vh !important; + } + + .max-vh-md-75 { + max-height: 75vh !important; + } + + .max-vh-md-60 { + max-height: 60vh !important; + } + + .max-vh-md-50 { + max-height: 50vh !important; + } + + .max-vh-md-40 { + max-height: 40vh !important; + } + + .max-vh-md-25 { + max-height: 25vh !important; + } + + .max-vh-md-none { + max-height: none !important; + } +} + +@media (min-width: 992px) { + .min-vh-lg-100 { + min-height: 100vh !important; + } + + .min-vh-lg-75 { + min-height: 75vh !important; + } + + .min-vh-lg-60 { + min-height: 60vh !important; + } + + .min-vh-lg-50 { + min-height: 50vh !important; + } + + .min-vh-lg-40 { + min-height: 40vh !important; + } + + .min-vh-lg-25 { + min-height: 25vh !important; + } + + .min-vh-lg-0 { + min-height: 0 !important; + } + + .vh-lg-100 { + height: 100vh !important; + } + + .vh-lg-75 { + height: 75vh !important; + } + + .vh-lg-60 { + height: 60vh !important; + } + + .vh-lg-50 { + height: 50vh !important; + } + + .vh-lg-40 { + height: 40vh !important; + } + + .vh-lg-25 { + height: 25vh !important; + } + + .h-lg-100 { + height: 100% !important; + } + + .h-lg-75 { + height: 75% !important; + } + + .h-lg-60 { + height: 60% !important; + } + + .h-lg-50 { + height: 50% !important; + } + + .h-lg-40 { + height: 40% !important; + } + + .h-lg-25 { + height: 25% !important; + } + + .h-lg-auto { + height: auto !important; + } + + .max-vh-lg-100 { + max-height: 100vh !important; + } + + .max-vh-lg-75 { + max-height: 75vh !important; + } + + .max-vh-lg-60 { + max-height: 60vh !important; + } + + .max-vh-lg-50 { + max-height: 50vh !important; + } + + .max-vh-lg-40 { + max-height: 40vh !important; + } + + .max-vh-lg-25 { + max-height: 25vh !important; + } + + .max-vh-lg-none { + max-height: none !important; + } +} + +@media (min-width: 1200px) { + .min-vh-xl-100 { + min-height: 100vh !important; + } + + .min-vh-xl-75 { + min-height: 75vh !important; + } + + .min-vh-xl-60 { + min-height: 60vh !important; + } + + .min-vh-xl-50 { + min-height: 50vh !important; + } + + .min-vh-xl-40 { + min-height: 40vh !important; + } + + .min-vh-xl-25 { + min-height: 25vh !important; + } + + .min-vh-xl-0 { + min-height: 0 !important; + } + + .vh-xl-100 { + height: 100vh !important; + } + + .vh-xl-75 { + height: 75vh !important; + } + + .vh-xl-60 { + height: 60vh !important; + } + + .vh-xl-50 { + height: 50vh !important; + } + + .vh-xl-40 { + height: 40vh !important; + } + + .vh-xl-25 { + height: 25vh !important; + } + + .h-xl-100 { + height: 100% !important; + } + + .h-xl-75 { + height: 75% !important; + } + + .h-xl-60 { + height: 60% !important; + } + + .h-xl-50 { + height: 50% !important; + } + + .h-xl-40 { + height: 40% !important; + } + + .h-xl-25 { + height: 25% !important; + } + + .h-xl-auto { + height: auto !important; + } + + .max-vh-xl-100 { + max-height: 100vh !important; + } + + .max-vh-xl-75 { + max-height: 75vh !important; + } + + .max-vh-xl-60 { + max-height: 60vh !important; + } + + .max-vh-xl-50 { + max-height: 50vh !important; + } + + .max-vh-xl-40 { + max-height: 40vh !important; + } + + .max-vh-xl-25 { + max-height: 25vh !important; + } + + .max-vh-xl-none { + max-height: none !important; + } +} + +@media (min-width: 1400px) { + .min-vh-xxl-100 { + min-height: 100vh !important; + } + + .min-vh-xxl-75 { + min-height: 75vh !important; + } + + .min-vh-xxl-60 { + min-height: 60vh !important; + } + + .min-vh-xxl-50 { + min-height: 50vh !important; + } + + .min-vh-xxl-40 { + min-height: 40vh !important; + } + + .min-vh-xxl-25 { + min-height: 25vh !important; + } + + .min-vh-xxl-0 { + min-height: 0 !important; + } + + .vh-xxl-100 { + height: 100vh !important; + } + + .vh-xxl-75 { + height: 75vh !important; + } + + .vh-xxl-60 { + height: 60vh !important; + } + + .vh-xxl-50 { + height: 50vh !important; + } + + .vh-xxl-40 { + height: 40vh !important; + } + + .vh-xxl-25 { + height: 25vh !important; + } + + .h-xxl-100 { + height: 100% !important; + } + + .h-xxl-75 { + height: 75% !important; + } + + .h-xxl-60 { + height: 60% !important; + } + + .h-xxl-50 { + height: 50% !important; + } + + .h-xxl-40 { + height: 40% !important; + } + + .h-xxl-25 { + height: 25% !important; + } + + .h-xxl-auto { + height: auto !important; + } + + .max-vh-xxl-100 { + max-height: 100vh !important; + } + + .max-vh-xxl-75 { + max-height: 75vh !important; + } + + .max-vh-xxl-60 { + max-height: 60vh !important; + } + + .max-vh-xxl-50 { + max-height: 50vh !important; + } + + .max-vh-xxl-40 { + max-height: 40vh !important; + } + + .max-vh-xxl-25 { + max-height: 25vh !important; + } + + .max-vh-xxl-none { + max-height: none !important; + } +} + + +/* ---------------------------------------------------------------- + Position Utility Classes: Extended +-----------------------------------------------------------------*/ + +@media (min-width: 576px) { + .position-sm-static { + position: static !important; + } + + .position-sm-relative { + position: relative !important; + } + + .position-sm-absolute { + position: absolute !important; + } + + .position-sm-fixed { + position: fixed !important; + } + + .position-sm-sticky { + position: -webkit-sticky !important; + position: sticky !important; + } +} + +@media (min-width: 768px) { + .position-md-static { + position: static !important; + } + + .position-md-relative { + position: relative !important; + } + + .position-md-absolute { + position: absolute !important; + } + + .position-md-fixed { + position: fixed !important; + } + + .position-md-sticky { + position: -webkit-sticky !important; + position: sticky !important; + } +} + +@media (min-width: 992px) { + .position-lg-static { + position: static !important; + } + + .position-lg-relative { + position: relative !important; + } + + .position-lg-absolute { + position: absolute !important; + } + + .position-lg-fixed { + position: fixed !important; + } + + .position-lg-sticky { + position: -webkit-sticky !important; + position: sticky !important; + } +} + +@media (min-width: 1200px) { + .position-xl-static { + position: static !important; + } + + .position-xl-relative { + position: relative !important; + } + + .position-xl-absolute { + position: absolute !important; + } + + .position-xl-fixed { + position: fixed !important; + } + + .position-xl-sticky { + position: -webkit-sticky !important; + position: sticky !important; + } +} + +@media (min-width: 1400px) { + .position-xxl-static { + position: static !important; + } + + .position-xxl-relative { + position: relative !important; + } + + .position-xxl-absolute { + position: absolute !important; + } + + .position-xxl-fixed { + position: fixed !important; + } + + .position-xxl-sticky { + position: -webkit-sticky !important; + position: sticky !important; + } +} + + +/* ---------------------------------------------------------------- + X/Y Positioning Classes +-----------------------------------------------------------------*/ + +.pos-x-start { + left: 0 !important; + right: auto !important; +} + +.pos-y-start { + top: 0 !important; + bottom: auto !important; +} + +.pos-x-end { + left: auto !important; + right: 0 !important; +} + +.pos-y-end { + top: auto !important; + bottom: 0 !important; +} + +.pos-x-center { + left: 50% !important; + right: auto !important; + transform: translateX(-50%) !important; +} + +.pos-y-center { + top: 50% !important; + bottom: auto !important; + transform: translateY(-50%) !important; +} + +.pos-x-center.pos-y-center { + top: 50% !important; + left: 50% !important; + transform: translate(-50%, -50%) !important; +} + + +/* ---------------------------------------------------------------- + Square Sizing Classes +-----------------------------------------------------------------*/ + +.square-xs { + width: 1rem !important; + height: 1rem !important; +} + +.square-sm { + width: 2rem !important; + height: 2rem !important; +} + +.square-md { + width: 4rem !important; + height: 4rem !important; +} + +.square-lg { + width: 6rem !important; + height: 6rem !important; +} + +.square-xl { + width: 8rem !important; + height: 8rem !important; +} + + +/* ---------------------------------------------------------------- + Text Sizing Classes +-----------------------------------------------------------------*/ + +.text-size-xs { + font-size: 0.875rem !important; +} + +.text-size-sm { + font-size: 1rem !important; +} + +.text-size-md { + font-size: 1.5rem !important; +} + +.text-size-lg { + font-size: 2rem !important; +} + +.text-size-xl { + font-size: calc(1rem + 2.25vw) !important; +} + +.text-size-xxl { + font-size: calc(1rem + 3.5vw) !important; +} + + +/* ---------------------------------------------------------------- + Lazy Loading +-----------------------------------------------------------------*/ + +.lazy { + opacity: 0; +} + +.lazy:not(.initial) { + transition: opacity 1s; +} + +.lazy.initial, +.lazy.lazy-loaded, +.lazy.lazy-error { + opacity: 1; +} + +img.lazy { + max-width: 100%; + height: auto; +} + +img.lazy:not([src]) { + visibility: hidden; +} + + +/* ---------------------------------------------------------------- + Sections +-----------------------------------------------------------------*/ + + +.section { + position: relative; + width: 100%; + margin: 60px 0; + padding: 60px 0; + background-color: #F9F9F9; + overflow: hidden; +} + +.parallax { + background-color: transparent; + background-attachment: fixed; + background-position: 50% 0; + background-repeat: no-repeat; + overflow: hidden; + will-change: transform; +} + +.mobile-parallax, +.video-placeholder { + background-size: cover !important; + background-attachment: scroll !important; + background-position: center center !important; +} + +.section .container { z-index: 2; } + +.section .container + .video-wrap { z-index: 1; } + +.revealer-image { + position: relative; + bottom: -100px; + transition: bottom .3s ease-in-out; + -webkit-transition: bottom .3s ease-in-out; + -o-transition: bottom .3s ease-in-out; +} + +.section:hover .revealer-image { bottom: -50px; } + + +/* ---------------------------------------------------------------- + Columns & Grids +-----------------------------------------------------------------*/ + + +.postcontent, +.sidebar { + position: relative; +} + + +/* ---------------------------------------------------------------- + Flex Slider +-----------------------------------------------------------------*/ + + +.fslider, +.fslider .flexslider, +.fslider .slider-wrap, +.fslider .slide, +.fslider .slide > a, +.fslider .slide > img, +.fslider .slide > a > img { + position: relative; + display: block; + width: 100%; + height: auto; + overflow: hidden; + -webkit-backface-visibility: hidden; +} + +.fslider.h-100 .flexslider, +.fslider.h-100 .slider-wrap, +.fslider.h-100 .slide { + height: 100% !important; +} + +.fslider { + min-height: 32px; +} + + +.flex-container a:active, +.flexslider a:active, +.flex-container a:focus, +.flexslider a:focus { + outline: none; + border: none; +} + +.slider-wrap, +.flex-control-nav, +.flex-direction-nav { + margin: 0; + padding: 0; + list-style: none; + border: none; +} + +.flexslider { + position: relative; + margin: 0; + padding: 0; +} + +.flexslider .slider-wrap > .slide { + display: none; + -webkit-backface-visibility: hidden; +} + +.flexslider .slider-wrap img { + width: 100%; + display: block; +} + +.flex-pauseplay span { + text-transform: capitalize; +} + +.slider-wrap::after { + content: "\0020"; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; +} + +html[xmlns] .slider-wrap { + display: block; +} + +* html .slider-wrap { + height: 1%; +} + +.no-js .slider-wrap > .slide:first-child {display: block;} + +.flex-viewport { + max-height: 2000px; + -webkit-transition: all 1s ease; + -o-transition: all 1s ease; + transition: all 1s ease; +} + + +/* ---------------------------------------------------------------- + Top Bar +-----------------------------------------------------------------*/ + + +#top-bar { + position: relative; + border-bottom: 1px solid #EEE; + font-size: 13px; +} + + +/* Top Links +---------------------------------*/ + +.top-links { + position: relative; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-positive: 0; + flex-grow: 0; + border-bottom: 1px solid #EEE; +} + +@media (min-width: 768px) { + .top-links { + border-bottom: 0; + } +} + +.top-links-container { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + list-style: none; + margin-bottom: 0; +} + +.top-links-item { + position: relative; + border-left: 1px solid #EEE; +} + +.top-links-item:first-child, +.top-links-sub-menu .top-links-item { border-left: 0 !important; } + +.top-links-item > a { + display: block; + padding: 12px; + font-size: 0.75rem; + line-height: 20px; + font-weight: 700; + text-transform: uppercase; + color: #666; +} + +.top-links-item > a > i { vertical-align: top; } + +.top-links-item > a > i.icon-angle-down { margin: 0 0 0 5px !important; } + +.top-links-item > a > i:first-child { margin-right: 3px; } + +.top-links-item.full-icon > a > i { + top: 2px; + font-size: 0.875rem; + margin: 0; +} + +.top-links-item:hover { background-color: #EEE; } + +.top-links-sub-menu, +.top-links-section { + position: absolute; + visibility: hidden; + pointer-events: none; + opacity: 0; + list-style: none; + z-index: -1; + line-height: 1.5; + background: #FFF; + border: 0; + top: 100%; + left: -1px; + width: 140px; + margin-top: 10px; + border: 1px solid #EEE; + border-top-color: #1ABC9C; + box-shadow: 0px 13px 42px 11px rgba(0, 0, 0, 0.05); + transition: opacity .25s ease, margin .2s ease; +} + +.top-links:not(.on-click) .top-links-item:hover > .top-links-sub-menu, +.top-links:not(.on-click) .top-links-item:hover > .top-links-section, +.top-links.on-click .top-links-sub-menu, +.top-links.on-click .top-links-section { + opacity: 1; + visibility: visible; + margin-top: 0; + pointer-events: auto; + z-index: 499; +} + +.top-links.on-click .top-links-sub-menu, +.top-links.on-click .top-links-section { + display: none; +} + +.top-links-sub-menu .top-links-sub-menu { + top: -1px; + left: 100%; +} + +.top-links-sub-menu .top-links-item:not(:first-child) { + border-top: 1px solid #F5F5F5; +} + +.top-links-sub-menu .top-links-item:hover { background-color: #F9F9F9; } + +.top-links-sub-menu .top-links-item > a { + padding-top: 9px; + padding-bottom: 9px; + font-size: 0.6875rem; +} + +.top-links-sub-menu .top-links-item > a > img { + display: inline-block; + position: relative; + top: -1px; + width: 16px; + height: 16px; + margin-right: 4px; +} + +.top-links-sub-menu.top-demo-lang .top-links-item > a > img { + top: 4px; + width: 16px; + height: 16px; +} + +.top-links-sub-menu .top-links-item > a > i.icon-angle-down { + margin: 0 !important; + position: absolute; + top: 50%; + left: auto; + right: 10px; + transform: translateY(-50%) rotate(-90deg); +} + +.top-links-section { + padding: 25px; + left: 0; + width: 280px; +} + +.top-links-section.menu-pos-invert { + left: auto; + right: 0; +} + + +/* Top Social +-----------------------------------------------------------------*/ + +#top-social { + display: -ms-flexbox; + display: flex; + justify-content: center; + margin: 0; +} + +#top-social li { + position: relative; + list-style: none; +} + +#top-social li { border-left: 1px solid #EEE; } + +#top-social li:first-child { border-left: 0 !important; } + +#top-social a { + display: -ms-flexbox; + display: flex; + width: auto; + overflow: hidden; + font-weight: bold; + color: #666; +} + +#top-social li a:hover { + color: #FFF !important; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); +} + +#top-social li .ts-icon, +#top-social li .ts-text { + display: block; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + height: 44px; + line-height: 44px; +} + +#top-social li .ts-icon { + width: 40px; + text-align: center; + font-size: 0.875rem; +} + +#top-social li .ts-text { + max-width: 0; + white-space: nowrap; + -webkit-transition: all .2s ease; + transition: all .2s ease; +} + +#top-social li a:hover .ts-text { + max-width: 200px; + padding-right: 12px; + -webkit-transition: all .4s ease; + transition: all .4s ease; +} + + +/* Top Login +-----------------------------------------------------------------*/ + +#top-login { margin-bottom: 0; } + +#top-login .checkbox { margin-bottom: 10px; } + +#top-login .form-control { position: relative; } + +#top-login .form-control:focus { border-color: #CCC; } + +#top-login .input-group#top-login-username { margin-bottom: -1px; } + +#top-login #top-login-username input, +#top-login #top-login-username .input-group-addon { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +#top-login .input-group#top-login-password { margin-bottom: 10px; } + +#top-login #top-login-password input, +#top-login #top-login-password .input-group-addon { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + + +/* ---------------------------------------------------------------- + Header +-----------------------------------------------------------------*/ + + +#header { + position: relative; + background-color: #FFF; + border-bottom: 1px solid #F5F5F5; +} + +#header-wrap { + position: relative; + background-color: #FFF; + width: 100%; +} + +.header-wrap-clone { + display: none; +} + +.header-row { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +@media (min-width: 992px) { + + #header-wrap { + position: fixed; + height: auto; + z-index: 299; + box-shadow: 0 0 0 rgba(0,0,0,0.1); + transition: height .2s ease 0s, background-color .3s ease 0s; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + will-change: left, top, transform; + } + + #top-bar + #header:not(.sticky-header) #header-wrap, + #slider + #header:not(.sticky-header) #header-wrap, + .floating-header:not(.sticky-header) #header-wrap, + div + #header-wrap, + .no-sticky #header-wrap, + [data-sticky-offset]:not([data-sticky-offset="full"]):not(.sticky-header) #header-wrap, + body:not(.stretched) #header:not(.sticky-header) #header-wrap { + position: absolute; + } + + .header-wrap-clone { + display: block; + height: calc( 100px + 1px ); + } + + .header-size-sm .header-wrap-clone { + height: calc( 60px + 1px ); + } + + .header-size-md .header-wrap-clone { + height: calc( 80px + 1px ); + } + + .header-size-lg .header-wrap-clone { + height: calc( 120px + 1px ); + } + + .header-row { + position: initial; + } + + #header.transparent-header, + #header.transparent-header:not(.sticky-header) #header-wrap { + background: transparent; + border-bottom: 1px solid transparent; + z-index: 299; + } + + #header.transparent-header.semi-transparent #header-wrap { background-color: rgba(255,255,255,0.8); } + + #header.transparent-header.floating-header { margin-top: 60px; } + + .transparent-header.floating-header .container { + background-color: #FFF; + padding: 0 30px; + } + + .transparent-header.floating-header:not(.sticky-header) .container { + position: relative; + } + + #header + .include-header { + margin-top: calc( -100px - 2px ); + display: inline-block; + vertical-align: bottom; + width: 100%; + } + + #header.header-size-sm + .include-header { + margin-top: calc( -60px - 2px ); + } + + #header.header-size-md + .include-header { + margin-top: calc( -80px - 2px ); + } + + #header.header-size-lg + .include-header { + margin-top: calc( -120px - 2px ); + } + + #header.floating-header + .include-header { + margin-top: calc( -160px - 2px ); + } + + #header.transparent-header + .page-title-parallax.include-header .container { + z-index: 5; + padding-top: 100px; + } + + #header.full-header:not(.transparent-header) { border-bottom-color: #EEE; } + + .stretched .full-header #header-wrap > .container { + width: 100%; + max-width: none; + padding: 0 30px; + } + + #header.transparent-header.full-header #header-wrap { + border-bottom: 1px solid rgba(0,0,0,0.1); + } + + #slider + #header.transparent-header.full-header #header-wrap { + border-top: 1px solid rgba(0,0,0,0.1); + border-bottom: none; + } + + /* ---------------------------------------------------------------- + Sticky Header + -----------------------------------------------------------------*/ + + #logo img { + -webkit-transition: height .4s ease, padding .4s ease, margin .4s ease, opacity .3s ease; + transition: height .4s ease, padding .4s ease, margin .4s ease, opacity .3s ease; + } + + #logo img { max-height: 100%; } + + .sub-menu-container, + .mega-menu-content { + -webkit-transition: top .4s ease; + transition: top .4s ease; + } + + .sticky-header #header-wrap { + position: fixed; + top: 0; + left: 0; + background-color: #FFF; + box-shadow: 0 0 10px rgba(0,0,0,0.1); + } + + .sticky-header.full-header #header-wrap { + border-bottom: 1px solid #EEE; + } + + .sticky-header.semi-transparent { background-color: transparent; } + + .semi-transparent.sticky-header #header-wrap { background-color: rgba(255,255,255,0.8) } + + /* Primary Menu - Style 3 + -----------------------------------------------------------------*/ + + .sticky-header .style-3 .menu-container > .menu-item > .menu-link { + margin: 0; + border-radius: 0; + } + + /* Primary Menu - Style 4 + -----------------------------------------------------------------*/ + + .sticky-header .style-4 .menu-container > .menu-item > .menu-link { + padding-top: 8px; + padding-bottom: 8px; + margin: 10px 0; + } + + /* Primary Menu - Style 5 + -----------------------------------------------------------------*/ + + .sticky-header-shrink .style-5 .menu-container > .menu-item { margin-left: 2px; } + + .sticky-header-shrink .style-5 .menu-container > .menu-item:first-child { margin-left: 0; } + + .sticky-header-shrink .style-5 .menu-container > .menu-item > .menu-link { + line-height: 22px; + padding-top: 19px; + padding-bottom: 19px; + } + + .sticky-header-shrink .style-5 .menu-container > .menu-item > .menu-link > div { padding: 0; } + + .sticky-header-shrink .style-5 .menu-container > .menu-item > .menu-link i:not(.icon-angle-down) { + display: inline-block; + width: 16px; + top: -1px; + margin: 0 6px 0 0; + font-size: 0.875rem; + line-height: 22px; + } + +} + +@media (max-width: 991.98px) { + + .sticky-header #header-wrap { + position: fixed; + top: 0; + left: 0; + z-index: 299; + background-color: #FFF; + border-bottom: 1px solid #EEE; + -webkit-transform: translateZ(0); + -webkit-backface-visibility: hidden; + } + + .sticky-header .header-wrap-clone { + display: block; + } + + .sticky-header .menu-container { + max-height: 60vh; + margin: 1rem 0; + overflow-x: hidden; + overflow-y: scroll; + } + + body:not(.primary-menu-open) .dark.transparent-header-responsive, + body:not(.primary-menu-open) .transparent-header-responsive { + background-color: transparent; + border: none; + } + + body:not(.primary-menu-open) .semi-transparent.transparent-header-responsive { + background-color: rgba(255,255,255,0.8); + z-index: 1; + } + +} + + +/* ---------------------------------------------------------------- + Logo +-----------------------------------------------------------------*/ + + +#logo { + position: relative; + display: -ms-flexbox; + display: flex; + align-items: center; + -ms-flex-align: center; + margin-right: auto; + max-height: 100%; +} + +#logo a { + color: #000; + font-family: 'Poppins', sans-serif; + font-size: 36px; +} + +#logo img { + display: block; + max-width: 100%; + max-height: 100%; + height: 100px; +} + +.header-size-sm #header-wrap #logo img { + height: 60px; +} + +.header-size-md #header-wrap #logo img { + height: 80px; +} + +.header-size-lg #header-wrap #logo img { + height: 120px; +} + +#logo a.standard-logo { + display: -ms-flexbox; + display: flex; +} + +#logo a.retina-logo { display: none; } + +@media (min-width: 992px) { + + .full-header #logo { + padding-right: 30px; + border-right: 1px solid #EEE; + } + + #header.transparent-header.full-header #logo { border-right-color: rgba(0,0,0,0.1); } + + .sticky-header-shrink #header-wrap #logo img { + height: 60px; + } + +} + + +/* ---------------------------------------------------------------- + Retina Logo +-----------------------------------------------------------------*/ + + +@media +only screen and (-webkit-min-device-pixel-ratio: 2), +only screen and ( min--moz-device-pixel-ratio: 2), +only screen and ( -o-min-device-pixel-ratio: 2/1), +only screen and ( min-device-pixel-ratio: 2), +only screen and ( min-resolution: 192dpi), +only screen and ( min-resolution: 2dppx) { + + #logo a.standard-logo { display: none; } + + #logo a.retina-logo { + display: -ms-flexbox; + display: flex; + } + +} + + +/* ---------------------------------------------------------------- + Header Right Area +-----------------------------------------------------------------*/ + + +.header-extras { + display: -ms-flexbox; + display: flex; + align-items: center; + margin-bottom: 0; +} + +.header-extras li { + display: -ms-flexbox; + display: flex; + margin-left: 1.25rem; + overflow: hidden; + list-style: none; +} + +.header-extras li:first-child { margin-left: 0; } + +.header-extras li .he-text { + padding-left: 10px; + font-weight: bold; + font-size: 0.875rem; +} + +.header-extras li .he-text span { + display: block; + font-weight: 400; + color: #1ABC9C; +} + + +/* ---------------------------------------------------------------- + Primary Menu +-----------------------------------------------------------------*/ + +.primary-menu { + display: -ms-flexbox; + display: flex; + flex-basis: 100%; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-align: center; + align-items: center; +} + +.primary-menu + .primary-menu { + border-top: 1px solid #EEE; +} + +#primary-menu-trigger, +#page-menu-trigger { + display: -ms-flex; + display: flex; + opacity: 1; + pointer-events: auto; + z-index: 1; + cursor: pointer; + font-size: 0.875rem; + width: 50px; + height: 50px; + line-height: 50px; + justify-content: center; + align-items: center; + -webkit-transition: opacity .3s ease; + transition: opacity .3s ease; +} + +body:not(.top-search-open) .top-search-parent #primary-menu-trigger { + opacity: 1; + -webkit-transition: opacity .2s .2s ease, top .4s ease; + -o-transition: opacity .2s .2s ease, top .4s ease; + transition: opacity .2s .2s ease, top .4s ease; +} + +.top-search-open .top-search-parent #primary-menu-trigger { + opacity: 0; +} + +.svg-trigger { + width: 30px; + height: 30px; + cursor: pointer; + -webkit-tap-highlight-color: transparent; + transition: transform 400ms; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.svg-trigger path { + fill: none; + transition: stroke-dasharray 400ms, stroke-dashoffset 400ms; + stroke: #333; + stroke-width: 5; + stroke-linecap:round; +} + +.svg-trigger path:nth-child(1) { stroke-dasharray: 40 160; } + +.svg-trigger path:nth-child(2) { + stroke-dasharray: 40 142; + transform-origin: 50%; + transition: transform 400ms; +} + +.svg-trigger path:nth-child(3) { + stroke-dasharray: 40 85; + transform-origin: 50%; + transition: transform 400ms, stroke-dashoffset 400ms; +} + +.primary-menu-open .svg-trigger { transform: rotate(45deg); } + +.primary-menu-open .svg-trigger path:nth-child(1), +.primary-menu-open .svg-trigger path:nth-child(3) { stroke-dashoffset: -64px; } + +.primary-menu-open .svg-trigger path:nth-child(2) { transform: rotate(90deg); } + +.menu-container { + display: none; + list-style: none; + margin: 0; + width: 100%; +} + +.menu-item { + position: relative; +} + +.menu-item:not(:first-child) { + border-top: 1px solid #EEE; +} + +.menu-link { + display: block; + line-height: 22px; + padding: 14px 5px; + color: #444; + font-weight: 700; + font-size: 0.8125rem; + letter-spacing: 1px; + text-transform: uppercase; + font-family: 'Poppins', sans-serif; +} + +.menu-link span { + display: none; +} + +.menu-link i { + position: relative; + top: -1px; + font-size: 0.875rem; + width: 16px; + text-align: center; + margin-right: 6px; + vertical-align: top; +} + +.menu-item:hover > .menu-link, +.menu-item.current > .menu-link { + color: #1ABC9C; +} + +.menu-item.sub-menu > .menu-link > div { } + +.sub-menu-container, +.mega-menu-content { + position: relative; + padding-left: 15px; + border-top: 1px solid #EEE; + list-style: none; + margin-bottom: 0; +} + +.sub-menu-container .menu-item:not(:first-child) { + border-top: 1px solid #EEE; +} + +.sub-menu-container .menu-item > .menu-link { + position: relative; + padding: 11px 5px; + font-size: 0.75rem; + font-weight: 400; + color: #666; + letter-spacing: 0; + font-family: 'Lato', sans-serif; +} + +.sub-menu-container .menu-item:hover > .menu-link { + font-weight: 700; +} + +.sub-menu-container .menu-link div { + position: relative; +} + +.menu-item .sub-menu-trigger { + display: block; + position: absolute; + cursor: pointer; + outline: none; + border: none; + background: none; + padding: 0; + top: 9px; + right: 0; + width: 32px; + height: 32px; + font-size: 12px; + line-height: 32px; + text-align: center; + -webkit-transition: transform .3s ease; + transition: transform .3s ease; +} + +.menu-link div > i.icon-angle-down { + display: none; +} + +.sub-menu-container .sub-menu-trigger { + font-size: 10px; +} + +.sub-menu-container .menu-item .sub-menu-trigger { + top: 6px; +} + + +/* ---------------------------------------------------------------- + Mega Menu +-----------------------------------------------------------------*/ + +.mega-menu:not(.mega-menu-full) .mega-menu-content .container { + max-width: none; +} + +.mega-menu-content { + padding-left: 0; +} + +@media (max-width: 991.98px) { + + .primary-menu { + max-width: 100%; + } + + .primary-menu > .container { + max-width: none; + padding: 0; + } + + .mega-menu-content .sub-menu-container { + border-top: 1px solid #EEE; + } + + .mega-menu-content .sub-menu-container:not(.mega-menu-dropdown) { + display: block !important; + } + + .mega-menu-content .mega-menu-column { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + padding-right: 0; + } + + .mega-menu-column .widget { + padding: 30px 0; + } + +} + +.mega-menu-content .mega-menu-column:first-child { + border-top: 0; +} + +/* Off Canvas Menu +-----------------------------------------------------------------*/ + +@media (max-width: 991.98px) { + + #header:not(.sticky-header) .mobile-menu-off-canvas .menu-container { + position: fixed; + display: block; + z-index: 499; + width: 280px; + height: 100%; + height: calc(100vh); + max-height: none !important; + margin: 0 !important; + left: 0 !important; + top: 0 !important; + padding: 35px 25px 60px !important; + background-color: #FFF; + border-right: 1px solid #EEE !important; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + -webkit-transform: translate(-280px,0); + -o-transform: translate(-280px,0); + transform: translate(-280px,0); + -webkit-backface-visibility: hidden; + transform-style: preserve-3d; + } + + #header:not(.sticky-header) .mobile-menu-off-canvas.from-right .menu-container { + left: auto !important; + right: 0; + border-right: 0 !important; + border-left: 1px solid #EEE !important; + -webkit-transform: translate(280px,0); + -o-transform: translate(280px,0); + transform: translate(280px,0); + } + + #header:not(.sticky-header) .mobile-menu-off-canvas .menu-container { + -webkit-transition: -webkit-transform .3s ease-in-out, opacity .2s ease !important; + -o-transition: -o-transform .3s ease-in-out, opacity .2s ease !important; + transition: transform .3s ease-in-out, opacity .2s ease !important; + } + + #header:not(.sticky-header) .mobile-menu-off-canvas .menu-container.d-block { + -webkit-transform: translate(0,0); + -o-transform: translate(0,0); + transform: translate(0,0); + } + +} + +@media (min-width: 992px) { + + .primary-menu { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-positive: 0; + flex-grow: 0; + } + + .primary-menu + .primary-menu { + border-top: 0; + } + + #primary-menu-trigger, + #page-menu-trigger { + display: none; + opacity: 0; + pointer-events: none; + z-index: 0; + } + + .menu-container:not(.mobile-primary-menu) { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + } + + .full-header .primary-menu .menu-container { + padding-right: 0.5rem; + margin-right: 0.5rem; + border-right: 1px solid #EEE; + } + + .transparent-header.full-header .primary-menu .menu-container { border-right-color: rgba(0,0,0,0.1); } + + .mega-menu { position: inherit; } + + .menu-container > .menu-item:not(:first-child) { + margin-left: 2px; + } + + .menu-item:not(:first-child) { + border-top: 0; + } + + .menu-item.menu-item-important .menu-link > div::after { + content: ''; + display: inline-block; + position: relative; + top: -5px; + left: 5px; + width: 8px; + height: 8px; + border-radius: 50%; + background-color: #dc3545; + } + + .menu-link { + padding: 39px 15px; + -webkit-transition: margin .4s ease, padding .4s ease; + -o-transition: margin .4s ease, padding .4s ease; + transition: margin .4s ease, padding .4s ease; + } + + .header-size-sm .menu-container > .menu-item > .menu-link { + padding-top: 19px; + padding-bottom: 19px; + } + + .header-size-md .menu-container > .menu-item > .menu-link { + padding-top: 29px; + padding-bottom: 29px; + } + + .header-size-lg .menu-container > .menu-item > .menu-link { + padding-top: 49px; + padding-bottom: 49px; + } + + .sticky-header-shrink .menu-container > .menu-item > .menu-link { + padding-top: 19px; + padding-bottom: 19px; + } + + .with-arrows .menu-container > .menu-item > .menu-link div > i.icon-angle-down { + display: inline-block; + } + + .sub-menu-container, + .mega-menu-content { + position: absolute; + visibility: hidden; + background-color: #FFF; + box-shadow: 0px 13px 42px 11px rgba(0, 0, 0, 0.05); + border: 1px solid #EEE; + border-top: 2px solid #1ABC9C; + z-index: 399; + top: 100%; + left: 0; + padding: 0; + } + + .menu-container > .menu-item:not(.mega-menu) .sub-menu-container:not([class*='col']) { + width: 220px; + } + + /* Sub-Menu On-Hover Dropdown */ + .primary-menu:not(.on-click) .menu-item:not(.mega-menu) .sub-menu-container, + .primary-menu:not(.on-click) .mega-menu-content { + display: block; + opacity: 0; + margin-top: 15px; + z-index: -9999; + pointer-events: none; + transition: opacity .3s ease, margin .25s ease; + } + + .primary-menu:not(.on-click) .menu-item.mega-menu .mega-menu-content .sub-menu-container:not(.mega-menu-dropdown) { + margin-top: 0; + z-index: auto; + } + + .primary-menu:not(.on-click) .menu-item.mega-menu:hover > .mega-menu-content .sub-menu-container:not(.mega-menu-dropdown) { + pointer-events: auto; + } + + .primary-menu:not(.on-click) .menu-item:hover > .sub-menu-container, + .primary-menu:not(.on-click) .menu-item:hover > .mega-menu-content { + opacity: 1; + visibility: visible; + margin-top: 0; + z-index: 399; + pointer-events: auto; + } + + .primary-menu:not(.on-click) .menu-item:not(:hover) > .sub-menu-container > *, + .primary-menu:not(.on-click) .menu-item:not(:hover) > .mega-menu-content > * { + display: none; + } + + .primary-menu:not(.on-click) .menu-item.mega-menu .mega-menu-content .sub-menu-container:not(.mega-menu-dropdown) > * { + display: block; + } + + .sub-menu-container .sub-menu-container { + list-style: none; + top: -2px !important; + left: 100%; + } + + .sub-menu-container.menu-pos-invert, + .mega-menu-content.menu-pos-invert { + left: auto; + right: 0; + } + + .sub-menu-container .sub-menu-container.menu-pos-invert { + right: 100%; + } + + .sub-menu-container .menu-item:not(:first-child) { + border-top: 0; + } + + .sub-menu-container .menu-item > .menu-link { + padding: 10px 15px; + font-weight: 700; + border: 0; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + } + + .sub-menu-container .menu-item > .menu-link i { vertical-align: middle; } + + .sub-menu-container .menu-item:hover > .menu-link { + background-color: #F9F9F9; + padding-left: 18px; + color: #1ABC9C; + } + + .menu-link div > i.icon-angle-down { + top: 0; + font-size: 0.875rem; + margin: 0 0 0 5px; + } + + .sub-menu-container .menu-link div > i.icon-angle-down, + .side-header .primary-menu:not(.on-click) .menu-link i.icon-angle-down { + display: block; + position: absolute; + top: 50%; + right: 0; + font-size: 0.875rem; + line-height: 1; + margin: 0; + transform: translateY(-50%) rotate(-90deg); + } + + .menu-item .sub-menu-trigger, + .side-header .on-click .sub-menu-container .menu-link i.icon-angle-down:last-child { + display: none; + } + + /* ---------------------------------------------------------------- + Mega Menu + -----------------------------------------------------------------*/ + + .mega-menu:not(.mega-menu-full) .mega-menu-content .container { + max-width: none; + padding: 0 var(--bs-gutter-x, 0.75rem) !important; + margin: 0 auto !important; + } + + .mega-menu-content { + margin: 0; + width: 100%; + max-width: none; + left: 50%; + transform: translateX(-50%); + } + + .mega-menu-full .mega-menu-content { + width: 100%; + left: 0; + transform: none; + } + + .mega-menu-small { + position: relative; + } + + .mega-menu-small .mega-menu-content { + left: 0; + width: 400px; + transform: none; + } + + .floating-header:not(.sticky-header) .mega-menu .mega-menu-content { + max-width: 100%; + } + + .sub-menu-container .mega-menu { + position: relative; + } + + .sub-menu-container .mega-menu-small .mega-menu-content { + top: 0; + left: 100%; + } + + .sub-menu-container .mega-menu-small .mega-menu-content.menu-pos-invert { + left: auto; + right: 100%; + } + + .mega-menu-content.mega-menu-style-2 { + padding: 0 10px; + } + + .mega-menu-content .sub-menu-container:not(.mega-menu-dropdown) { + position: relative; + display: block !important; + visibility: visible !important; + top: 0 !important; + left: 0; + min-width: inherit; + height: auto !important; + list-style: none; + border: 0; + box-shadow: none; + background-color: transparent; + opacity: 1 !important; + z-index: auto; + } + + .mega-menu-content .sub-menu-container.mega-menu-dropdown { + padding: 0.75rem; + width: 220px; + } + + .mega-menu-column { + display: block !important; + padding-left: 0; + padding-right: 0; + } + + .sub-menu-container.mega-menu-column:not(:first-child) { + border-left: 1px solid #F2F2F2; + } + + .mega-menu-style-2 .mega-menu-column { + padding: 30px 20px; + } + + .mega-menu-style-2 .mega-menu-title:not(:first-child) { + margin-top: 20px; + } + + .mega-menu-style-2 .mega-menu-title > .menu-link { + font-size: 0.8125rem; + font-weight: 700; + font-family: 'Poppins', sans-serif; + letter-spacing: 1px; + text-transform: uppercase !important; + margin-bottom: 15px; + color: #444; + padding: 0 !important; + line-height: 1.3 !important; + } + + .mega-menu-style-2 .mega-menu-title:hover > .menu-link { + background-color: transparent; + } + + .mega-menu-style-2 .mega-menu-title > .menu-link:hover { + color: #1ABC9C; + } + + .mega-menu-style-2 .sub-menu-container:not(.mega-menu-dropdown) .menu-item { + border: 0; + } + + .mega-menu-style-2 .sub-menu-container .menu-link { + padding-left: 5px; + padding-top: 7px; + padding-bottom: 7px; + } + + .mega-menu-style-2 .sub-menu-container .menu-item:hover > .menu-link { padding-left: 12px; } + + /* Sub-Menu On-Click Dropdown */ + .on-click .sub-menu-container, + .on-click .mega-menu-content { + display: none; + visibility: visible; + } + + .on-click .menu-item:not(.mega-menu-small) .mega-menu-content .sub-menu-container:not(.mega-menu-dropdown) { + display: block; + } + + + /* Primary Menu - Style 2 + -----------------------------------------------------------------*/ + + .style-2 #logo { + margin-right: 1.5rem; + } + + .style-2 .primary-menu { + margin-right: auto; + } + + .style-2.menu-center .primary-menu { + margin-right: auto; + margin-left: auto; + } + + + /* Primary Menu - Style 3 + -----------------------------------------------------------------*/ + + .style-3 .menu-container > .menu-item > .menu-link { + margin: 28px 0; + padding-top: 11px; + padding-bottom: 11px; + border-radius: 2px; + } + + .style-3 .menu-container > .menu-item:hover > .menu-link { + color: #444; + background-color: #F5F5F5; + } + + .style-3 .menu-container > .menu-item.current > .menu-link { + color: #FFF; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); + background-color: #1ABC9C; + } + + + /* Primary Menu - Style 4 + -----------------------------------------------------------------*/ + + .style-4 .menu-container > .menu-item > .menu-link { + margin: 28px 0; + padding-top: 10px; + padding-bottom: 10px; + border-radius: 2px; + border: 1px solid transparent; + } + + .style-4 .menu-container > .menu-item:hover > .menu-link, + .style-4 .menu-container > .menu-item.current > .menu-link { border-color: #1ABC9C; } + + + /* Primary Menu - Style 5 + -----------------------------------------------------------------*/ + + .style-5 .menu-container { + padding-right: 10px; + margin-right: 5px; + border-right: 1px solid #EEE; + } + + .style-5 .menu-container > .menu-item:not(:first-child) { margin-left: 15px; } + + .style-5 .menu-container > .menu-item > .menu-link { + padding-top: 27px; + padding-bottom: 27px; + line-height: 1; + } + + .style-5 .menu-container > .menu-item > .menu-link i:not(.icon-angle-down) { + display: block; + width: auto; + margin: 0 0 12px; + font-size: 20px; + line-height: 1; + transition: all .3s ease; + } + + + /* Primary Menu - Style 6 + -----------------------------------------------------------------*/ + + .style-6 .menu-container > .menu-item > .menu-link { position: relative; } + + .style-6 .menu-container > .menu-item > .menu-link::after, + .style-6 .menu-container > .menu-item.current > .menu-link::after { + content: ''; + position: absolute; + top: 0; + left: 50%; + height: 2px; + width: 0; + border-top: 2px solid #1ABC9C; + -webkit-transition: width .3s ease; + -o-transition: width .3s ease; + transition: width .3s ease; + transform: translateX(-50%); + } + + .style-6 .menu-container > .menu-item.current > .menu-link::after, + .style-6 .menu-container > .menu-item:hover > .menu-link::after { width: 100%; } + + + /* Primary Menu - Sub Title + -----------------------------------------------------------------*/ + + .sub-title .menu-container > .menu-item { + margin-left: 0; + } + + .sub-title .menu-container > .menu-item > .menu-link { + position: relative; + line-height: 14px; + padding: 32px 20px; + text-transform: uppercase; + } + + .sub-title .menu-container > .menu-item:not(:first-child) > .menu-link::before { + content: ''; + position: absolute; + top: 50%; + left: 0; + z-index: -2; + width: 1px; + height: 36px; + background-color: #EEE; + transform: translateY(-50%); + } + + .sub-title .menu-container > .menu-item > .menu-link span { + display: block; + margin-top: 10px; + line-height: 12px; + font-size: 11px; + font-weight: 400; + color: #888; + text-transform: capitalize; + } + + .sub-title .menu-container > .menu-item:hover > .menu-link, + .sub-title .menu-container > .menu-item.current > .menu-link { + color: #FFF; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); + } + + .sub-title .menu-container > .menu-item:hover > .menu-link span, + .sub-title .menu-container > .menu-item.current > .menu-link span { color: #EEE; } + + .sub-title .menu-container > .menu-item:hover > .menu-link::after, + .sub-title .menu-container > .menu-item.current > .menu-link::after { + content: ''; + position: absolute; + top: 0; + left: 0; + z-index: -1; + width: 100%; + height: 100%; + background-color: #1ABC9C; + border-top: 5px solid rgba(0,0,0,0.1); + } + + + /* ---------------------------------------------------------------- + Side Header + -----------------------------------------------------------------*/ + + .side-header:not(.open-header) #wrapper { + margin: 0 0 0 260px !important; + width: auto !important; + } + + .side-header .container { + padding-left: 30px; + padding-right: 30px; + } + + .side-header #header { + position: fixed; + top: 0; + left: 0; + z-index: 10; + width: 260px; + height: 100%; + height: calc(100vh); + background-color: #FFF; + border: none; + border-right: 1px solid #EEE; + overflow: hidden; + box-shadow: 0 0 15px rgba(0, 0, 0, 0.065); + } + + .side-header #header-wrap { + position: relative; + width: 300px; + width: calc( 100% + 40px ); + height: 100%; + overflow-y: scroll; + padding-right: 40px; + } + + .side-header #header-wrap > .container { + width: 260px; + max-width: none; + padding: 0 30px; + margin: 0 !important; + min-height: 100%; + display: -ms-flexbox; + display: flex; + } + + .side-header .header-wrap-clone { + display: none; + } + + .side-header .header-row { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + + .side-header #logo { + margin: 3rem 0; + width: 100%; + } + + .side-header #logo img { + max-width: 100%; + } + + .side-header .header-misc { + width: 100%; + margin: 0; + } + + .side-header .primary-menu { + margin-bottom: 30px; + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + width: 100%; + } + + .side-header .primary-menu:not(.border-bottom-0)::after { margin-top: 40px; } + + .side-header .menu-container { + display: block; + height: auto; + width: 100%; + } + + .no-triggers .menu-container .sub-menu-trigger { + display: none; + } + + .side-header .on-click .menu-item .sub-menu-trigger { + display: block; + top: 0; + right: -5px; + font-size: 10px; + } + + .side-header .primary-menu:not(.on-click) .text-center i.icon-angle-down { + display: inline-block; + position: relative; + top: 2px; + margin-left: 5px; + transform: none; + } + + .side-header .primary-menu:not(.on-click) .text-center .sub-menu-container i.icon-angle-down { + top: -1px; + } + + .side-header .menu-item { + width: 100%; + } + + .side-header .menu-item:not(:first-child) { + margin: 10px 0 0; + border-top: 0; + } + + .side-header .menu-link { + position: relative; + padding: 5px 0 !important; + margin: 0 !important; + text-transform: uppercase; + } + + .side-header .sub-menu-container, + .side-header .mega-menu-content { + position: relative; + width: 100%; + background-color: transparent; + box-shadow: none; + border: none; + height: auto; + z-index: 1; + top: 0; + left: 0; + margin: 5px 0; + padding: 0 0 0 12px !important; + } + + .side-header .mega-menu-content { + padding: 0 !important; + margin-bottom: 0 !important; + } + + .side-header .mega-menu-column { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + border: none !important; + } + + .side-header .sub-menu-container .sub-menu-container { + top: 0 !important; + left: 0; + } + + .side-header .sub-menu-container.menu-pos-invert { + left: 0; + right: auto; + } + + .side-header .sub-menu-container .sub-menu-container.menu-pos-invert { right: auto; } + + .side-header .sub-menu-container .menu-item { + margin: 0; + border: 0; + } + + .side-header .sub-menu-container .menu-item:first-child { border-top: 0; } + + .side-header .menu-item:hover > .menu-link { + background-color: transparent !important; + } + + .side-header .menu-container > .menu-item.sub-menu > .menu-link, + .side-header .menu-container > .menu-item.sub-menu:hover > .menu-link { background-image: none !important; } + + + /* Side Header - Push Header + -----------------------------------------------------------------*/ + + .side-header.open-header.push-wrapper { overflow-x: hidden; } + + .side-header.open-header #header { left: -260px; } + + .side-header.open-header.side-header-open #header { left: 0; } + + .side-header.open-header #wrapper { left: 0; } + + .side-header.open-header.push-wrapper.side-header-open #wrapper { left: 260px; } + + #header-trigger { display: none; } + + .side-header.open-header #header-trigger { + display: block; + position: fixed; + cursor: pointer; + top: 20px; + left: 20px; + z-index: 11; + font-size: 1rem; + width: 32px; + height: 32px; + line-height: 32px; + background-color: #FFF; + text-align: center; + border-radius: 2px; + } + + .side-header.open-header.side-header-open #header-trigger { left: 280px; } + + .side-header.open-header #header-trigger i:nth-child(1), + .side-header.open-header.side-header-open #header-trigger i:nth-child(2) { display: block; } + + .side-header.open-header.side-header-open #header-trigger i:nth-child(1), + .side-header.open-header #header-trigger i:nth-child(2) { display: none; } + + + .side-header.open-header #header, + .side-header.open-header #header-trigger, + .side-header.open-header.push-wrapper #wrapper { + -webkit-transition: left .4s ease; + -o-transition: left .4s ease; + transition: left .4s ease; + } + + + /* Side Header - Right Aligned + -----------------------------------------------------------------*/ + + .side-header.side-header-right #header { + left: auto; + right: 0; + border: none; + border-left: 1px solid #EEE; + } + + .side-header.side-header-right:not(.open-header) #wrapper { margin: 0 260px 0 0 !important; } + + .side-header.side-header-right.open-header #header { + left: auto; + right: -260px; + } + + .side-header.side-header-right.open-header.side-header-open #header { + left: auto; + right: 0; + } + + .side-header.side-header-right.open-header.push-wrapper.side-header-open #wrapper { left: -260px; } + + .side-header.side-header-right.open-header #header-trigger { + left: auto; + right: 20px; + } + + .side-header.side-header-right.open-header.side-header-open #header-trigger { + left: auto; + right: 280px; + } + + .side-header.side-header-right.open-header #header, + .side-header.side-header-right.open-header #header-trigger { + -webkit-transition: right .4s ease; + -o-transition: right .4s ease; + transition: right .4s ease; + } + + + /* Primary Menu - Overlay Menu + -----------------------------------------------------------------*/ + + .overlay-menu:not(.top-search-open) #primary-menu-trigger { + display: -ms-flexbox; + display: flex; + opacity: 1; + pointer-events: auto; + width: 30px; + height: 30px; + line-height: 30px; + } + + .overlay-menu .primary-menu > #overlay-menu-close { + position: fixed; + top: 25px; + left: auto; + right: 25px; + width: 48px; + height: 48px; + line-height: 48px; + font-size: 1.5rem; + text-align: center; + color: #444; + } + + .overlay-menu #primary-menu-trigger { + z-index: 599; + } + + .overlay-menu .primary-menu { + position: fixed; + top: 0; + left: 0; + padding: 0 !important; + margin: 0 !important; + border: 0 !important; + width: 100%; + height: 100%; + height: calc(100vh); + background-color: rgba(255,255,255,0.95); + } + + .overlay-menu .primary-menu, + .overlay-menu .primary-menu > #overlay-menu-close { + opacity: 0 !important; + pointer-events: none; + z-index: -2; + -webkit-transform: translateY(-80px); + transform: translateY(-80px); + -webkit-transition: opacity .4s ease, transform .45s ease !important; + transition: opacity .4s ease, transform .45s ease !important; + } + + .overlay-menu.primary-menu-open .primary-menu, + .overlay-menu.primary-menu-open #overlay-menu-close { + opacity: 1 !important; + pointer-events: auto; + z-index: 499; + -webkit-transform: translateY(0); + transform: translateY(0); + -webkit-transition: opacity .3s ease, transform .45s ease !important; + transition: opacity .3s ease, transform .45s ease !important; + } + + .overlay-menu .primary-menu, + .overlay-menu.primary-menu-open .primary-menu { + -webkit-transform: translateY(0px); + transform: translateY(0px); + -webkit-transition: opacity .3s ease !important; + transition: opacity .3s ease !important; + } + + .overlay-menu .primary-menu > .container { + max-height: 90%; + overflow-y: scroll; + } + + .overlay-menu .menu-container { + display: -ms-flexbox !important; + display: flex !important; + flex-direction: column; + max-width: 250px; + padding: 0 !important; + margin: 0 auto !important; + border: 0 !important; + } + + .overlay-menu .menu-container > .menu-item > .menu-link { + font-size: 0.9375rem; + } + + .overlay-menu .menu-item { + width: 100%; + } + + .overlay-menu .menu-link { + padding-top: 10px; + padding-bottom: 10px; + padding-left: 0; + padding-right: 0; + } + + .overlay-menu .sub-menu-container, + .overlay-menu .mega-menu-content { + display: none; + position: relative; + top: 0 !important; + left: 0 !important; + right: auto; + width: 100%; + max-width: 100%; + box-shadow: none; + background: transparent; + border: 0; + padding: 10px 0 !important; + transform: translateX(0); + } + + .overlay-menu .mega-menu-content .sub-menu-container { + padding: 5px 0 !important; + } + + .overlay-menu .mega-menu-title .sub-menu-container { + padding-top: 0 !important; + } + + .overlay-menu .mega-menu-content .mega-menu-column { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + padding-left: 0; + padding-right: 0; + border: 0 !important; + } + + .overlay-menu .sub-menu-container .menu-link { + padding: 5px 0; + } + + .overlay-menu .sub-menu-container .menu-item:hover > .menu-link { + padding-left: 0; + padding-right: 0; + background: transparent; + } + + .overlay-menu .sub-menu-container .menu-link i.icon-angle-down { + position: relative; + display: inline-block; + top: -1px; + left: 0; + margin-left: 5px; + transform: rotate(0deg); + } + +} + +@media (max-width: 991.98px) { + + .side-push-panel #side-panel-trigger-close a { + display: block; + position: absolute; + z-index: 12; + top: 0; + left: auto; + right: 0; + width: 40px; + height: 40px; + font-size: 18px; + line-height: 40px; + color: #444; + text-align: center; + background-color: rgba(0,0,0,0.1); + border-radius: 0 0 0 2px; + } + +} + + +/* ---------------------------------------------------------------- + Top Search +-----------------------------------------------------------------*/ + +.header-misc { + position: initial; + display: -ms-flexbox; + display: flex; + align-items: center; + margin-left: 15px; +} + +.header-misc-element, +.header-misc-icon { + margin: 0 8px; +} + +.header-misc-icon > a { + display: block; + position: relative; + width: 20px; + height: 20px; + font-size: 1.125rem; + line-height: 20px; + text-align: center; + color: #333; + -webkit-transition: color .3s ease-in-out; + -o-transition: color .3s ease-in-out; + transition: color .3s ease-in-out; +} + +@media (min-width: 992px) { + .header-misc:not([class*="order-"]) { + -ms-flex-order: 6; + order: 6; + } +} + +#top-search a { z-index: 11; } + +#top-search a i { + position: absolute; + top: 0; + left: 3px; + -webkit-transition: opacity .3s ease; + -o-transition: opacity .3s ease; + transition: opacity .3s ease; +} + +.top-search-open #top-search a i.icon-line-search, +#top-search a i.icon-line-cross { opacity: 0; } + +.top-search-open #top-search a i.icon-line-cross { + opacity: 1; + z-index: 11; + font-size: 1rem; +} + +.top-search-form { + opacity: 0; + z-index: -2; + pointer-events: none; + position: absolute; + width: 100% !important; + height: 100%; + padding: 0; + margin: 0; + top: 0; + left: 0; + -webkit-transition: opacity .3s ease-in-out; + -o-transition: opacity .3s ease-in-out; + transition: opacity .3s ease-in-out; +} + +.top-search-open .top-search-form { + opacity: 1; + z-index: 10; + pointer-events: auto; +} + +.top-search-form input { + box-shadow: none !important; + border-radius: 0; + border: 0; + outline: 0 !important; + font-size: 24px; + padding: 10px 80px 10px 0; + height: 100%; + background-color: transparent !important; + color: #333; + font-weight: 700; + margin-top: 0 !important; + font-family: 'Poppins', sans-serif; + letter-spacing: 2px; +} + +@media (min-width: 992px) { + .top-search-form input { font-size: 32px; } + + .full-header .top-search-form input, + .container-fluid .top-search-form input { + padding-left: 30px; + } + + .transparent-header:not(.sticky-header):not(.full-header):not(.floating-header) .top-search-form input { + border-bottom: 2px solid rgba(0,0,0,0.1); + } +} + +.search-overlay .top-search-form { + position: fixed; + width: 100%; + height: 100vh; + top: 0; + left: 0; + display: -ms-flexbox; + display: flex; + background-color: #fff; + align-items: center; + justify-content: center; +} + +.search-overlay .top-search-form input { + max-width: 580px; + margin: 0 auto; + text-align: center; + padding: 0 40px; +} + +.top-search-form input::-moz-placeholder { + color: #555; + opacity: 1; + text-transform: uppercase; +} +.top-search-form input:-ms-input-placeholder { + color: #555; + text-transform: uppercase; +} +.top-search-form input::-webkit-input-placeholder { + color: #555; + text-transform: uppercase; +} + +.primary-menu .container .top-search-form input, +.sticky-header .top-search-form input { border: none !important; } + +/* Top Search Animation */ + +#top-search { + -webkit-transition: opacity .3s ease; + transition: opacity .3s ease; +} + +body:not(.top-search-open) .top-search-parent #logo, +body:not(.top-search-open) .top-search-parent .primary-menu, +body:not(.top-search-open) .top-search-parent .header-misc > *:not(#top-search) { + opacity: 1; + -webkit-transition: padding .4s ease, margin .4s ease, opacity .2s .2s ease; + transition: padding .4s ease, margin .4s ease, opacity .2s .2s ease; +} + +.top-search-open .top-search-parent #logo, +.top-search-open .top-search-parent .primary-menu, +.top-search-open .top-search-parent .header-misc > *:not(#top-search) { opacity: 0; } + + +/* ---------------------------------------------------------------- + Top Cart +-----------------------------------------------------------------*/ + + +.top-cart-number { + display: block; + position: absolute; + top: -7px; + left: auto; + right: -8px; + font-size: 0.625rem; + color: #FFF; + width: 1.125rem; + height: 1.125rem; + line-height: 1.125rem; + text-align: center; + border-radius: 50%; + z-index: 1; + overflow: hidden; +} + +.top-cart-number::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #1ABC9C; + opacity: 0.8; + z-index: -1; +} + +.top-cart-content { + position: fixed; + top: 0; + left: auto; + width: 260px; + background-color: #FFF; + border-left: 1px solid #EEE; + box-shadow: 0px 20px 50px 10px rgba(0, 0, 0, 0.05); + -webkit-transition: right .3s ease; + -o-transition: right .3s ease; + transition: right .3s ease; +} + +@media (max-width: 991.98px) { + .top-cart-content { + right: -260px !important; + height: calc(100vh); + z-index: 499; + } + + .top-cart-open .top-cart-content { + right: 0 !important; + } +} + +.top-cart-title { + padding: 0.75rem 1rem; + border-bottom: 1px solid #EEE; +} + +.top-cart-title h4 { + margin-bottom: 0; + font-size: 0.875rem; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 1px; +} + +.top-cart-items { + padding: 1rem; +} + +.top-cart-item, +.top-cart-action, +.top-cart-item-desc { + display: -ms-flexbox; + display: flex; + -ms-flex-pack: justify; + justify-content: space-between; + -ms-flex-align: start; + align-items: flex-start; +} + +.top-cart-item { + -ms-flex-pack: start; + justify-content: flex-start; +} + +.top-cart-item:not(:first-child) { + padding-top: 1rem; + margin-top: 1rem; + border-top: 1px solid #F5F5F5; +} + +.top-cart-item-image { + width: 48px; + height: 48px; + border: 2px solid #EEE; + -webkit-transition: border-color .2s linear; + -o-transition: border-color .2s linear; + transition: border-color .2s linear; +} + +.top-cart-item-image a, +.top-cart-item-image img { + display: block; + width: 44px; + height: 44px; +} + +.top-cart-item-image:hover { border-color: #1ABC9C; } + +.top-cart-item-desc, +.top-cart-item-desc-title { + padding-left: 1rem; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.top-cart-item-desc { + -ms-flex-align: start; + align-items: flex-start; +} + +.top-cart-item-desc-title { + padding-left: 0; +} + +.top-cart-item-desc a { + display: block; + font-size: 0.8125rem; + line-height: 1.25rem; + color: #333; + font-weight: 700; + margin-bottom: 5px; +} + +.top-cart-item-desc a:hover { color: #1ABC9C; } + +.top-cart-item-price { + font-size: 0.75rem; + color: #999; +} + +.top-cart-item-quantity { + font-size: 0.75rem; + line-height: 1.25rem; + color: #444; +} + +.top-cart-action { + -ms-flex-align: center; + align-items: center; + padding: 1rem; + border-top: 1px solid #EEE; +} + +.top-cart-action .top-checkout-price { + font-size: 1.25rem; + color: #1ABC9C; +} + +@media (min-width: 992px) { + #top-cart { + position: relative; + } + + .top-cart-content { + opacity: 0; + position: absolute; + width: 280px; + border: 1px solid #EEE; + border-top: 2px solid #1ABC9C; + top: calc( 100% + 20px ); + right: -15px; + margin: -10000px 0 0; + z-index: auto; + -webkit-transition: opacity .5s ease, top .4s ease; + -o-transition: opacity .5s ease, top .4s ease; + transition: opacity .5s ease, top .4s ease; + } + + #top-cart.on-hover:hover .top-cart-content, + .top-cart-open .top-cart-content { + opacity: 1; + z-index: 399; + margin-top: 0; + } + + .top-cart-items { + padding: 1rem; + } +} + + +/* ---------------------------------------------------------------- + Page Menu +-----------------------------------------------------------------*/ + +#page-menu { + position: relative; + text-shadow: 1px 1px 1px rgba(0,0,0,0.1); +} + +#page-menu-wrap { + position: absolute; + z-index: 199; + top: 0; + left: 0; + width: 100%; + background-color: #1ABC9C; + transform: translateZ(0); + -webkit-backface-visibility: hidden; +} + +#page-menu.sticky-page-menu #page-menu-wrap { + position: fixed; + box-shadow: 0 0 15px rgba(0,0,0,0.3); +} + +#page-menu-trigger { + opacity: 1; + pointer-events: auto; + top: 0; + margin-top: 0; + left: auto; + right: 15px; + width: 40px; + height: 44px; + line-height: 44px; + color: #FFF; +} + +.page-menu-open #page-menu-trigger { background-color: rgba(0,0,0,0.2); } + +.page-menu-row { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-wrap: wrap; + flex-wrap: wrap; +} + +.page-menu-title { + color: #FFF; + font-size: 1.25rem; + font-weight: 300; + margin-right: auto; +} + +.page-menu-title span { font-weight: 700; } + +.page-menu-nav { + display: none; + position: absolute; + width: 200px; + top: 100%; + left: auto; + right: 0; + height: auto; + background-color: #1ABC9C; +} + +#page-menu.page-menu-open .page-menu-nav { display: block; } + +.page-menu-nav .page-menu-container { + margin: 0; + list-style: none; + background-color: rgba(0,0,0,0.2); +} + +.page-menu-item { + position: relative; +} + +.page-menu-item > a { + display: block; + position: relative; + line-height: 22px; + padding: 11px 14px; + color: #FFF; + font-size: 0.875rem; +} + +.page-menu-item:hover > a, +.page-menu-item.current > a { background-color: rgba(0,0,0,0.15); } + +.page-menu-item > a .icon-angle-down { + position: absolute; + top: 50%; + left: auto; + right: 14px; + transform: translateY(-50%); +} + +.page-menu-sub-menu { + display: none; + background-color: rgba(0,0,0,0.15); + list-style: none; + padding: 1px 10px 5px; +} + +.page-menu-item:hover > .page-menu-sub-menu { + display: block; +} + +.page-menu-sub-menu .page-menu-item > a { + margin: 5px 0; + padding-top: 3px; + padding-bottom: 3px; + border-radius: 14px; +} + +@media (min-width: 992px) { + + .page-menu-nav { + display: -ms-flex; + display: flex; + position: relative; + width: auto; + top: 0; + left: 0; + background-color: transparent !important; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -ms-flex-positive: 0; + flex-grow: 0; + } + + .page-menu-nav .page-menu-container { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + list-style: none; + background-color: transparent; + } + + .page-menu-item > a { + margin: 10px 4px; + padding-top: 3px; + padding-bottom: 3px; + border-radius: 14px; + } + + .page-menu-item > a .icon-angle-down { + position: relative; + top: 1px; + left: 0; + right: 0; + margin-left: 8px; + transform: none; + } + + body:not(.device-touch) .page-menu-item > a { + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + } + + .page-menu-sub-menu { + display: none; + position: absolute; + list-style: none; + width: 150px; + top: 100%; + left: 0; + padding: 0; + background-color: #1ABC9C; + } + + .page-menu-sub-menu .page-menu-item > a { + height: auto; + margin: 0; + padding-top: 10px; + padding-bottom: 10px; + border-radius: 0; + background-color: rgba(0,0,0,0.15); + } + + .page-menu-sub-menu li:hover a, + .page-menu-sub-menu li.current a { background-color: rgba(0,0,0,0.3); } + + + /* Page Menu - Dots Style + -----------------------------------------------------------------*/ + + #page-menu.dots-menu { + position: fixed; + top: 50%; + left: auto; + right: 20px; + width: 24px; + line-height: 1.5; + text-shadow: none; + transform: translateY(-50%); + z-index: 299; + } + + .dots-menu #page-menu-wrap { + position: relative; + top: 0 !important; + box-shadow: none; + background-color: transparent !important; + } + + .dots-menu .page-menu-wrap-clone { + display: none; + } + + .dots-menu .container { + padding: 0; + } + + .dots-menu .page-menu-title { display: none; } + + .dots-menu .page-menu-nav { + display: block; + width: 100%; + } + + .dots-menu .page-menu-container { + flex-direction: column; + -ms-flex-direction: column; + } + + .dots-menu .page-menu-item { + width: 10px; + height: 10px; + margin: 10px 0; + } + + .dots-menu .page-menu-item > a { + position: absolute; + width: 100%; + height: 100%; + padding: 0; + margin: 0; + background-color: rgba(0,0,0,0.4); + border-radius: 50%; + color: #777; + } + + .dots-menu .page-menu-item > a:hover { + background-color: rgba(0,0,0,0.7); + } + + .dots-menu .page-menu-item.current > a { background-color: #1ABC9C; } + + .dots-menu.dots-menu-border .page-menu-item { + width: 12px; + height: 12px; + } + + .dots-menu.dots-menu-border .page-menu-item > a { + background-color: transparent !important; + border: 3px solid rgba(0,0,0,0.4); + } + + .dots-menu.dots-menu-border .page-menu-item > a:hover { + border-color: rgba(0,0,0,0.7); + } + + .dots-menu.dots-menu-border .page-menu-item.current > a { border-color: #1ABC9C; } + + .dots-menu .page-menu-item div { + position: absolute; + width: auto; + top: 50%; + right: 25px; + background-color: #1ABC9C; + font-size: 0.75rem; + text-transform: uppercase; + letter-spacing: 1px; + color: #FFF; + padding: 6px 14px; + white-space: nowrap; + pointer-events: none; + text-shadow: 1px 1px 1px rgba(0,0,0,0.15); + border-radius: 2px; + opacity: 0; + transform: translateY(-50%); + } + + body:not(.device-touch) .dots-menu .page-menu-item div { + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + } + + .dots-menu .page-menu-item div::after { + position: absolute; + content: ''; + top: 50%; + left: auto; + right: -5px; + width: 0; + height: 0; + border-top: 7px solid transparent; + border-bottom: 7px solid transparent; + border-left: 6px solid #1ABC9C; + transform: translateY(-50%); + } + + .dots-menu .page-menu-item > a:hover div { + opacity: 1; + right: 30px; + } + +} + + +/* ---------------------------------------------------------------- + One Page +-----------------------------------------------------------------*/ + +.one-page-arrow { + position: absolute; + z-index: 3; + bottom: 20px; + left: 50%; + margin-left: -16px; + width: 32px; + height: 32px; + font-size: 32px; + text-align: center; + color: #222; +} + + +/* ---------------------------------------------------------------- + Side Push Panel +-----------------------------------------------------------------*/ + +.side-push-panel { overflow-x: hidden; } + +#side-panel { + position: fixed; + top: 0; + right: -300px; + z-index: 699; + width: 300px; + height: 100%; + background-color: #F5F5F5; + overflow: hidden; + -webkit-backface-visibility: hidden; +} + +.side-panel-left #side-panel { + left: -300px; + right: auto; +} + +.side-push-panel.stretched #wrapper, +.side-push-panel.stretched .sticky-header .container { right: 0; } + +.side-panel-left.side-push-panel.stretched #wrapper, +.side-panel-left.side-push-panel.stretched .sticky-header .container { + left: 0; + right: auto; +} + +#side-panel .side-panel-wrap { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 330px; + height: 100%; + overflow: auto; + padding: 50px 70px 50px 40px; +} + +.device-touch #side-panel .side-panel-wrap { overflow-y: scroll; } + +#side-panel .widget { + margin-top: 40px; + padding-top: 40px; + width: 220px; + border-top: 1px solid #E5E5E5; +} + +#side-panel .widget:first-child { + padding-top: 0; + border-top: 0; + margin: 0; +} + +.side-panel-open #side-panel { right: 0; } + +.side-panel-left.side-panel-open #side-panel { + left: 0; + right: auto; +} + +.side-push-panel.side-panel-open.stretched #wrapper, +.side-push-panel.side-panel-open.stretched .sticky-header .container { right: 300px; } + +.side-push-panel.side-panel-open.stretched.device-xl .slider-inner, +.side-push-panel.side-panel-open.stretched.device-lg .slider-inner { left: -300px; } + +.side-panel-left.side-push-panel.side-panel-open.stretched #wrapper, +.side-panel-left.side-push-panel.side-panel-open.stretched .sticky-header .container, +.side-panel-left.side-push-panel.side-panel-open.stretched .slider-inner { + left: 300px; + right: auto; +} + +#side-panel-trigger { + display: block; + cursor: pointer; + z-index: 11; + margin-right: 5px; +} + +#side-panel-trigger-close a { display: none; } + +#side-panel, +.side-push-panel.stretched #wrapper, +.side-push-panel.stretched #header .container { + -webkit-transition: right .4s ease; + -o-transition: right .4s ease; + transition: right .4s ease; +} + +.side-panel-left #side-panel, +.side-panel-left.side-push-panel.stretched #wrapper, +.side-panel-left.side-push-panel.stretched #header .container, +.side-push-panel.stretched .slider-inner { + -webkit-transition: left .4s ease; + -o-transition: left .4s ease; + transition: left .4s ease; +} + +.body-overlay { + opacity: 0; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0,0,0,0.6); + z-index: -1; + pointer-events: none; + -webkit-backface-visibility: hidden; + -webkit-transition: opacity .3s ease; + -o-transition: opacity .3s ease; + transition: opacity .3s ease; +} + +.side-panel-open .body-overlay { + opacity: 1; + z-index: 599; + pointer-events: auto; +} + +.side-panel-open:not(.device-xs):not(.device-sm):not(.device-md) .body-overlay:hover { cursor: url('images/icons/close.png') 15 15, default; } + + +/* ---------------------------------------------------------------- + Slider +-----------------------------------------------------------------*/ + + +.slider-element { + position: relative; + width: 100%; + overflow: hidden; +} + +.slider-parallax { position: relative; } + +.slider-parallax, +.slider-parallax .swiper-container { + visibility: visible; + -webkit-backface-visibility: hidden; +} + +.slider-inner { + position: absolute; + overflow: hidden; + opacity: 1; + visibility: visible; + width: 100%; + height: 100%; + background-position: center center; + background-repeat: no-repeat; + background-size: cover; +} + +.slider-parallax .slider-inner { + position: fixed; +} + +.h-auto:not(.slider-parallax) .slider-inner, +.h-auto .swiper-container, +.min-vh-0:not(.slider-parallax) .slider-inner, +.min-vh-0 .swiper-container { + position: relative !important; + height: auto !important; +} + +.slider-parallax-invisible .slider-inner { + opacity: 0; + visibility: hidden; +} + +@media (min-width: 992px) { + .h-auto .swiper-wrapper, + .min-vh-0 .swiper-wrapper { + height: 75vh; + } +} + +.slider-inner.slider-inner-relative { + position: relative !important; + height: auto !important; +} + +.device-touch .slider-parallax .slider-inner { position: relative; } + +body:not(.side-header) .slider-parallax .slider-inner { left: 0; } + +body:not(.stretched) .slider-parallax .slider-inner { left: auto; } + +.slider-parallax .slider-inner, +.slider-parallax .slider-caption { + will-change: transform; + -webkit-transform: translate3d(0,0,0); + -webkit-transition: transform 0s linear; + -webkit-backface-visibility: hidden; +} + + +@media (max-width: 991.98px) { + + #slider { + display: -ms-flexbox !important; + display: flex !important; + flex-direction: column; + justify-content: center; + } + + #slider .slider-inner { + position: relative; + display: -ms-flexbox; + display: flex; + flex-grow: 1; + align-items: center; + } + +} + + +/* Boxed Slider +-----------------------------------------------------------------*/ + +.boxed-slider { padding-top: 40px; } + + +/* Swiper Slider +-----------------------------------------------------------------*/ + +.swiper_wrapper { + position: relative; + width: 100%; + overflow: hidden; +} + +.full-screen .swiper_wrapper { height: auto; } + +.swiper_wrapper .swiper-container { + position: absolute; + width: 100%; + height: 100%; + margin: 0; +} + +.swiper_wrapper .swiper-slide { + position: relative; + margin: 0; + overflow: hidden; +} + +.swiper-slide-bg { + background-position: center center; + background-repeat: no-repeat; + background-size: cover; +} + +.swiper-slide [data-caption-animate] { -webkit-backface-visibility: hidden; } + +.slider-element .video-wrap, +.section .video-wrap, +.swiper-slide .yt-bg-player, +.section .yt-bg-player, +.swiper-slide-bg { + position: absolute; + width: 100%; + height: 100%; + z-index: -1; + top: 0; + left: 0; +} + +.yt-bg-player .inlinePlayButton, +.yt-bg-player .loading { display: none !important; } + +.slider-element .container, +.slider-element .container-fuild { + position: relative; + height: 100%; +} + +.slider-element.canvas-slider .swiper-slide img { width: 100%; } + +.slider-element.canvas-slider a { + display: block; + height: 100%; +} + + +.swiper-pagination { + position: absolute; + width: 100%; + z-index: 20; + margin: 0; + top: auto; + bottom: 20px !important; + text-align: center; + line-height: 1; +} + +.swiper-pagination span { + display: inline-block; + cursor: pointer; + width: 10px; + height: 10px; + margin: 0 4px; + opacity: 1; + background-color: transparent; + border: 1px solid #FFF; + border-radius: 50%; + -webkit-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease; +} + +.swiper-pagination span:hover, +.swiper-pagination span.swiper-pagination-bullet-active { background-color: #FFF !important; } + + +/* Video Overlay +-----------------------------------------------------------------*/ + +.video-wrap { + overflow: hidden; + width: 100%; + position: relative; + direction: ltr; +} + +.video-wrap video { + position: relative; + z-index: 1; + opacity: 1; + width: 100%; + transition: opacity .3s 1s ease; + /*min-width: 100%; + min-height: 100%; + top: 50%; + transform: translateY(-50%);*/ +} + +body:not(.has-plugin-html5video) .video-wrap video { + opacity: 0; +} + +.video-overlay, +.video-placeholder { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 5; + background: transparent url('images/grid.png') repeat; + transform: translateZ(0); + -webkit-backface-visibility: hidden; +} + +.video-placeholder { + z-index: 4; + background-repeat: no-repeat !important; +} + + +/* Slider Caption +-----------------------------------------------------------------*/ + +.slider-caption { + position: relative; + display: -ms-flexbox; + display: flex; + height: 100%; + flex-flow: column; + justify-content: center; + z-index: 20; + max-width: 550px; + color: #EEE; + font-size: 1.375rem; + font-weight: 300; + text-shadow: 1px 1px 1px rgba(0,0,0,0.15); + -webkit-transition: top .3s ease; + -o-transition: top .3s ease; + transition: top .3s ease; +} + +.slider-caption:not(.dark), +.slider-caption:not(.dark) h2 { + color: #222; + text-shadow: none; +} + +.slider-caption h2 { + font-size: 4rem; + letter-spacing: 2px; + text-transform: uppercase; + font-weight: 700; + line-height: 1; + margin-bottom: 0; +} + +.slider-caption p { + margin-top: 30px; + margin-bottom: 10px; + font-size: 1.5rem; +} + +@media (max-width: 991.98px) { + + .swiper_wrapper .slider-caption h2 { + font-size: 5.5vw; + } + + .swiper_wrapper .slider-caption p { + font-size: 2.6vw; + } + +} + +.slider-caption.slider-caption-right { + margin-left: auto; +} + +.slider-caption.slider-caption-center { + position: relative; + max-width: 800px; + text-align: center; + margin: 0 auto; + left: 0; + right: 0; +} + +.slider-caption-bg { + padding: 5px 12px; + border-radius: 2px; + background-color: rgba(0,0,0,0.6); + top: auto; + bottom: 50px; + left: 50px; +} + +.slider-caption-bg.slider-caption-bg-light { + background-color: rgba(255,255,255,0.8); + color: #333; + font-weight: 400; + text-shadow: none; +} + +.slider-caption-top-left { + top: 50px; + bottom: auto; +} + +.slider-caption-top-right { + top: 50px; + bottom: auto; + left: auto; + right: 50px; +} + +.slider-caption-bottom-right { + left: auto; + right: 50px; +} + + +/* Slider Arrows +-----------------------------------------------------------------*/ + +.slider-element .owl-carousel { margin: 0; } + +.slider-arrow-left, +.slider-arrow-right, +.flex-prev, +.flex-next, +.slider-arrow-top-sm, +.slider-arrow-bottom-sm { + position: absolute; + cursor: pointer; + z-index: 10; + top: 50%; + left: 0; + background-color: rgba(0,0,0,0.3); + width: 52px; + height: 52px; + border: 0; + border-radius: 0 3px 3px 0; + transform: translateY(-50%); + -webkit-transition: background-color .3s ease-in-out; + -o-transition: background-color .3s ease-in-out; + transition: background-color .3s ease-in-out; +} + +.slider-arrow-top-sm, +.slider-arrow-bottom-sm { + top: auto; + bottom: 57px; + left: auto; + right: 20px; + margin: 0; + width: 32px; + height: 32px; + border-radius: 3px 3px 0 0; +} + +.slider-arrow-bottom-sm { + bottom: 20px; + border-radius: 0 0 3px 3px; +} + +.fslider[data-thumbs="true"] .flex-prev, +.fslider[data-thumbs="true"] .flex-next { margin-top: -20px; } + +.slider-arrow-right, +.slider-element .owl-next, +.flex-next { + left: auto; + right: 0; + border-radius: 3px 0 0 3px; +} + +.slider-arrow-left i, +.slider-arrow-right i, +.flex-prev i, +.flex-next i, +.slider-arrow-top-sm i, +.slider-arrow-bottom-sm i { + line-height: 50px; + width: 100%; + height: 100%; + color: #DDD; + color: rgba(255,255,255,0.8); + text-shadow: 1px 1px 1px rgba(0,0,0,0.1); + font-size: 34px; + text-align: center; + transition: color .3s ease-in-out; +} + + +.slider-arrow-top-sm i, +.slider-arrow-bottom-sm i { + width: 32px; + height: 32px; + margin: 0; + line-height: 30px; + font-size: 18px; + color: #FFF; + color: rgba(255,255,255,1); +} + +.slider-element .owl-prev i { margin-left: 0; } + +.slider-element .owl-next i { margin-right: 4px; } + +.slider-arrow-left:hover, +.slider-arrow-right:hover, +.flex-prev:hover, +.flex-next:hover, +.slider-arrow-top-sm:hover, +.slider-arrow-bottom-sm:hover { background-color: rgba(0,0,0,0.6) !important; } + + +/* Slide Number +-----------------------------------------------------------------*/ + +.slide-number { + position: absolute; + opacity: 0; + top: auto; + right: 20px; + bottom: 20px; + z-index: 20; + width: 36px; + height: 40px; + text-align: center; + color: rgba(255,255,255,0.8); + text-shadow: 1px 1px 1px rgba(0,0,0,0.15); + font-size: 18px; + font-weight: 300; + -webkit-transition: all .3s linear; + -o-transition: all .3s linear; + transition: all .3s linear; +} + +.slider-element:hover .slide-number { opacity: 1; } + +.slide-number-current, +.slide-number-total { + position: absolute; + line-height: 1; + top: 5px; + left: 0; +} + +.slide-number-total { + top: auto; + bottom: 5px; + left: auto; + right: 0; +} + +.slide-number span { + display: block; + font-size: 32px; + line-height: 40px; +} + + +/* Pagination +-----------------------------------------------------------------*/ + +.slider-element .owl-dots { + position: absolute; + width: 100%; + z-index: 20; + margin: 0; + top: auto; + bottom: 15px; +} + +.slider-element .owl-dots button { + width: 10px; + height: 10px; + margin: 0 3px; + opacity: 1 !important; + background-color: transparent !important; + border: 1px solid #FFF; +} + +.slider-element .owl-dots .owl-dot.active, +.slider-element .owl-dots .owl-dot:hover { background-color: #FFF !important; } + + +/* Flex Slider - Navigation +-----------------------------------------------------------------*/ + +.nav-offset .flex-prev, +.nav-offset .flex-next { + border-radius: 3px; +} + +.nav-offset .flex-prev { + left: 20px; +} + +.nav-offset .flex-next { + right: 20px; +} + +.nav-circle .flex-prev, +.nav-circle .flex-next { + border-radius: 50%; +} + +.nav-solid .flex-prev, +.nav-solid .flex-next { + opacity: 1; + background-color: #FFF; +} + +.nav-solid .flex-prev:hover, +.nav-solid .flex-next:hover { + background-color: #333 !important; +} + +.nav-solid .flex-prev:not(:hover) i, +.nav-solid .flex-next:not(:hover) i { + color: #444; + text-shadow: none; +} + + +.nav-size-sm .flex-prev, +.nav-size-sm .flex-next { + width: 32px; + height: 32px; +} + +.nav-size-sm .flex-prev i, +.nav-size-sm .flex-next i { + line-height: 32px; + font-size: 1.5rem; +} + +.fslider[class*="nav-pos-"] .flex-prev, +.fslider[class*="nav-pos-"] .flex-next { + position: relative; + display: block; + top: 0; + left: 0; + right: 0; + margin: 0 5px; + transform: none; +} + +.fslider.nav-size-sm[class*="nav-pos-"] .flex-prev, +.fslider.nav-size-sm[class*="nav-pos-"] .flex-next { + margin: 0 3px; +} + +.fslider[class*="nav-pos-"] .flex-direction-nav { + display: -ms-flexbox; + display: flex; + align-items: center; + justify-content: center; + position: absolute; + width: 100%; +} + +.nav-pos-top .flex-direction-nav, +.nav-pos-top-left .flex-direction-nav, +.nav-pos-top-right .flex-direction-nav { + top: 20px; + left: 0; +} + +.nav-pos-bottom .flex-direction-nav, +.nav-pos-bottom-left .flex-direction-nav, +.nav-pos-bottom-right .flex-direction-nav { + top: auto; + bottom: 20px; +} + +.nav-pos-top-left .flex-direction-nav, +.nav-pos-bottom-left .flex-direction-nav { + width: auto !important; + left: 16px; +} + +.nav-pos-top-right .flex-direction-nav, +.nav-pos-bottom-right .flex-direction-nav { + width: auto !important; + left: auto; + right: 16px; +} + + +/* Flex Slider - Pagination & Thumbs +-----------------------------------------------------------------*/ + +.fslider[data-animation="fade"][data-thumbs="true"] .flexslider, +.fslider.testimonial[data-animation="fade"] .flexslider { height: auto !important; } + +.flex-control-nav { + display: -ms-flexbox; + display: flex; + position: absolute; + align-items: center; + justify-content: center; + width: auto; + z-index: 10; + text-align: center; + top: 14px; + right: 10px; + margin: 0; +} + +.flex-control-nav li { + display: block; + margin: 0 3px; + width: 0.625rem; + height: 0.625rem; +} + +.flex-control-nav li a { + display: block; + cursor: pointer; + text-indent: -9999px; + width: 100% !important; + height: 100% !important; + border: 1px solid #FFF; + color: transparent; + border-radius: 50%; + transition: all .3s ease-in-out; + -webkit-transition: all .3s ease-in-out; + -o-transition: all .3s ease-in-out; +} + +.flex-control-nav li:hover a, +.flex-control-nav li a.flex-active { + background-color: #FFF; +} + + +.control-solid .flex-control-nav li a { + border: none; + background-color: #FFF; +} + +.control-solid .flex-control-nav li:hover a, +.control-solid .flex-control-nav li a.flex-active { + background-color: #1ABC9C; +} + + +.control-square .flex-control-nav li a { + border-radius: 3px; +} + +.control-diamond .flex-control-nav li a { + border-radius: 3px; + transform: rotate(45deg); +} + + +/* Flex Slider: Pagination Positions +-----------------------------------------------------------------*/ + +.control-offset-lg .flex-control-nav { + top: 24px; + right: 20px; +} + +.control-pos-top-left .flex-control-nav, +.control-pos-bottom-left .flex-control-nav { + left: 10px; + right: auto; +} + +.control-offset-lg.control-pos-top-left .flex-control-nav, +.control-offset-lg.control-pos-bottom-left .flex-control-nav { + left: 20px; +} + +.control-pos-bottom-right .flex-control-nav, +.control-pos-bottom-left .flex-control-nav, +.control-pos-bottom .flex-control-nav, +.control-pos-bottom .flex-control-nav { + top: auto; + bottom: 14px; +} + +.control-offset-lg.control-pos-bottom-right .flex-control-nav, +.control-offset-lg.control-pos-bottom-left .flex-control-nav, +.control-offset-lg.control-pos-bottom .flex-control-nav, +.control-offset-lg.control-pos-bottom .flex-control-nav { + bottom: 24px; +} + +.control-pos-bottom .flex-control-nav, +.control-pos-bottom .flex-control-nav, +.control-pos-top .flex-control-nav, +.control-pos-top .flex-control-nav { + width: 100%; + right: 0; +} + + +.control-size-lg .flex-control-nav li { + width: 0.9325rem; + height: 0.9325rem; + margin: 0 5px; +} + +/* Flex Slider: Thumbs +-----------------------------------------------------------------*/ + +.flex-control-nav.flex-control-thumbs { + position: relative; + justify-content: left; + top: 0; + left: 0; + right: 0; + margin: 2px -2px -2px 0; + height: auto; +} + +.flex-control-nav.flex-control-thumbs li { margin: 0 2px 2px 0; } + +.flex-control-nav.flex-control-thumbs li img { + cursor: pointer; + text-indent: -9999px; + border: 0; + border-radius: 0; + margin: 0; + opacity: 0.5; + -webkit-transition: all .3s ease-in-out; + -o-transition: all .3s ease-in-out; + transition: all .3s ease-in-out; +} + +.flex-control-nav.flex-control-thumbs li, +.flex-control-nav.flex-control-thumbs li img { + display: block; + width: 100px !important; + height: auto !important; +} + +.flex-control-nav.flex-control-thumbs li:hover img, +.flex-control-nav.flex-control-thumbs li img.flex-active { + border-width: 0; + opacity: 1; +} + + +/* FlexSlider: Thumbs - Flexible +-----------------------------------------------------------------*/ + +.fslider.flex-thumb-grid .flex-control-nav.flex-control-thumbs { + margin: 2px -2px -2px 0; + height: auto; + display: flex; + flex-wrap: wrap; +} + +.fslider.flex-thumb-grid .flex-control-nav.flex-control-thumbs li { + flex-shrink: 0; + flex: 0 0 auto; + max-width: 100%; + height: auto !important; + margin: 0; + padding: 0 2px 2px 0; +} + +.fslider.flex-thumb-grid .flex-control-nav.flex-control-thumbs li { + width: 25% !important; +} + +.fslider.flex-thumb-grid.grid-3 .flex-control-nav.flex-control-thumbs li { + width: 33.333333% !important; +} + +.fslider.flex-thumb-grid.grid-5 .flex-control-nav.flex-control-thumbs li { + width: 20% !important; +} + +.fslider.flex-thumb-grid.grid-6 .flex-control-nav.flex-control-thumbs li { + width: 16.666666% !important; +} + +.fslider.flex-thumb-grid.grid-8 .flex-control-nav.flex-control-thumbs li { + width: 12.5% !important; +} + +.fslider.flex-thumb-grid.grid-10 .flex-control-nav.flex-control-thumbs li { + width: 10% !important; +} + +.fslider.flex-thumb-grid.grid-12 .flex-control-nav.flex-control-thumbs li { + width: 8.333333% !important; +} + +.fslider.flex-thumb-grid .flex-control-nav.flex-control-thumbs li img { + width: 100% !important; + height: auto !important; +} + + +/* ---------------------------------------------------------------- + Page Title +-----------------------------------------------------------------*/ + + +#page-title { + position: relative; + padding: 4rem 0; + background-color: #F5F5F5; + border-bottom: 1px solid #EEE; +} + +#page-title .container { + position: relative; +} + +#page-title h1 { + padding: 0; + margin: 0; + line-height: 1; + font-weight: 600; + letter-spacing: 1px; + color: #333; + font-size: 2rem; + text-transform: uppercase; +} + +#page-title span { + display: block; + margin-top: 10px; + font-weight: 300; + color: #777; + font-size: 1.125rem; +} + +.breadcrumb { + position: absolute !important; + width: auto !important; + top: 50% !important; + left: auto !important; + right: 15px !important; + margin: 0 !important; + background-color: transparent !important; + padding: 0 !important; + font-size: 90%; + transform: translateY(-50%); +} + +.transparent-header + .page-title-parallax .breadcrumb { margin-top: 35px !important; } + +.breadcrumb a { color: #555; } + +.breadcrumb a:hover { color: #1ABC9C; } + +.breadcrumb i { width: auto !important; } + +/* Page Title - Dark +-----------------------------------------------------------------*/ + +#page-title.page-title-dark { + background-color: #333; + text-shadow: 1px 1px 1px rgba(0,0,0,0.1) !important; + border-bottom: none; +} + +#page-title.page-title-dark h1 { color: rgba(255,255,255,0.9) !important; } + +#page-title.page-title-dark span { color: rgba(255,255,255,0.7) !important; } + +#page-title.page-title-dark .breadcrumb > .active { color: rgba(255,255,255,0.6); } + +#page-title.page-title-dark .breadcrumb a { color: rgba(255,255,255,0.8); } + +#page-title.page-title-dark .breadcrumb a:hover { color: rgba(255,255,255,0.95); } + +#page-title.page-title-dark .breadcrumb-item + .breadcrumb-item::before { + color: #CCC; +} + +/* Page Title - Right Aligned +-----------------------------------------------------------------*/ + +.page-title-right { text-align: right; } + +.page-title-right .breadcrumb { + left: 15px !important; + right: auto !important; +} + +/* Page Title - Center Aligned +-----------------------------------------------------------------*/ + +.page-title-center { text-align: center; } + +#page-title.page-title-center span { + max-width: 700px; + margin-left: auto; + margin-right: auto; +} + +#page-title.page-title-center .breadcrumb { + position: relative !important; + top: 0 !important; + left: 0 !important; + right: 0 !important; + margin: 20px 0 0 !important; + justify-content: center; + transform: translateY(0); +} + +/* Page Title - Background Pattern +-----------------------------------------------------------------*/ + +.page-title-pattern { + background-image: url('images/pattern.png'); + background-repeat: repeat; + background-attachment: fixed; +} + +/* Page Title - Parallax Background +-----------------------------------------------------------------*/ + +.page-title-parallax { + padding: 100px 0; + text-shadow: none; + border-bottom: none; +} + +#page-title.page-title-parallax h1 { + font-size: 40px; + font-weight: 600; + letter-spacing: 2px; +} + +#page-title.page-title-parallax span { font-size: 1.25rem; } + +#page-title.page-title-parallax .breadcrumb { font-size: 0.875rem; } + +.page-title-parallax { + background-color: transparent; + background-image: url('images/parallax/parallax-bg.jpg'); + background-attachment: fixed; + background-position: 50% 0; + background-repeat: no-repeat; +} + + +/* Page Title - Mini +-----------------------------------------------------------------*/ + +#page-title.page-title-mini { padding: 20px 0; } + +#page-title.page-title-mini h1 { + font-weight: 600; + font-size: 18px; + color: #444; +} + +#page-title.page-title-mini span { display: none; } + + +/* Page Title - No Background +-----------------------------------------------------------------*/ + +#page-title.page-title-nobg { + background: transparent !important; + border-bottom: 1px solid #F5F5F5; +} + + +/* Page Title - Video +-----------------------------------------------------------------*/ + +.page-title-video { + background: none; + position: relative; + overflow: hidden; +} + +.page-title-video .container { + z-index: 5; +} + +.page-title-video .video-wrap { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; +} + +.page-title-video .video-wrap video { width: 100%; } + +@media (max-width: 767.98px) { + #page-title { + padding: 2rem 0; + text-align: center; + } + + #page-title h1 { + line-height: 1.5; + font-size: calc( 1rem + 2vw ); + } + + .page-title-parallax span { + font-size: 1rem; + } + + #page-title .breadcrumb { + position: relative !important; + top: 0 !important; + left: 0 !important; + right: 0 !important; + margin: 20px 0 0 !important; + justify-content: center; + -webkit-transform: translateY(0); + transform: translateY(0); + } + + #page-title #portfolio-navigation, + #portfolio-ajax-title #portfolio-navigation { + position: relative; + top: 0; + left: 0; + margin: 15px auto 0; + } +} + + +/* ---------------------------------------------------------------- + Content +-----------------------------------------------------------------*/ + + +#content { + position: relative; + background-color: #FFF; +} + +#content p { line-height: 1.8; } + +.content-wrap { + position: relative; + padding: 80px 0; + overflow: hidden; +} + +#content .container { position: relative; } + +.grid-container, +.grid-inner { + position: relative; + overflow: hidden; +} + +.grid-inner { + width: 100%; + background-size: cover; + background-position: center center; + background-repeat: no-repeat; +} + +body:not(.device-touch) .grid-container { + -webkit-transition: height .4s ease; + -o-transition: height .4s ease; + transition: height .4s ease; +} + + +/* ---------------------------------------------------------------- + Portfolio +-----------------------------------------------------------------*/ + + +/* Grid Filter +-----------------------------------------------------------------*/ + +.grid-filter-wrap { + display: -ms-flexbox; + display: flex; + justify-content: space-between; +} + +.grid-filter { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + margin-bottom: 3.5rem; + list-style: none; +} + +.grid-filter li { + position: relative; + width: 50%; +} + +.grid-filter li a { + display: block; + position: relative; + padding: 10px 20px; + font-size: 0.9375rem; + color: #666; + text-align: center; + border-radius: 2px; +} + +.grid-filter li a:hover { color: #1ABC9C; } + +.grid-filter li.activeFilter a { + color: #FFF; + background-color: #1ABC9C; + margin: 0; + font-weight: bold; +} + +@media (min-width: 576px) { + .grid-filter li { + width: 33.333333%; + } +} + +@media (min-width: 768px) { + .grid-filter li { + width: auto; + } + + .grid-filter { + border: 1px solid rgba(0,0,0,0.07); + border-radius: 4px; + } + + .grid-filter li a { + border-left: 1px solid rgba(0,0,0,0.07); + border-radius: 0; + } + + .grid-filter li:first-child a { + border-left: none; + border-radius: 4px 0 0 4px; + } + + .grid-filter li:last-child a { border-radius: 0 4px 4px 0; } + + .grid-filter li.activeFilter a { + margin: -1px 0; + padding-top: 11px; + padding-bottom: 11px; + } + + .bothsidebar .grid-filter li a { padding: 12px 14px; } + + .bothsidebar .grid-filter li.activeFilter a { padding: 13px 18px; } +} + + +/* Grid Filter: Style 2 +-----------------------------------------------------------------*/ + +.grid-filter.style-2, +.grid-filter.style-3, +.grid-filter.style-4 { + border: none; + border-radius: 0; + margin-bottom: 2.75rem; +} + +.grid-filter.style-2 li, +.grid-filter.style-3 li, +.grid-filter.style-4 li { margin-bottom: 0.75rem; } + +@media (min-width: 768px) { + .grid-filter.style-2 li:not(:first-child), + .grid-filter.style-3 li:not(:first-child) { margin-left: 10px; } +} + +.grid-filter.style-2 li a, +.grid-filter.style-3 li a, +.grid-filter.style-4 li a { + padding-top: 9px; + padding-bottom: 9px; + border-radius: 22px; + border: none; +} + +.grid-filter.style-2 li.activeFilter a { + color: #FFF !important; + margin: 0; +} + + +/* Grid Filter: Style 3 +-----------------------------------------------------------------*/ + +.grid-filter.style-3 li a { border: 1px solid transparent; } + +.grid-filter.style-3 li.activeFilter a { + color: #1ABC9C !important; + border-color: #1ABC9C; + background-color: transparent; + margin: 0; +} + + +/* Grid Filter: Style 4 +-----------------------------------------------------------------*/ + +@media (min-width: 768px) { + .grid-filter.style-4 li:not(:first-child) { margin-left: 30px; } +} + +.grid-filter.style-4 li a { + padding: 13px 5px; + border-radius: 0; +} + +.grid-filter.style-4 li a::after { + content: ''; + position: absolute; + top: auto; + bottom: 0; + left: 50%; + width: 0; + height: 2px; + -webkit-transition: all 0.3s ease; + -o-transition: all 0.3s ease; + transition: all 0.3s ease; +} + +.grid-filter.style-4 li.activeFilter a { + color: #444 !important; + background-color: transparent; + margin: 0; +} + +.grid-filter.style-4 li.activeFilter a::after { + width: 100%; + left: 0%; + background-color: #1ABC9C; +} + + +/* Portfolio - Shuffle Icon +-----------------------------------------------------------------*/ + +.grid-shuffle { + width: 42px; + height: 42px; + border: 1px solid rgba(0,0,0,0.07); + font-size: 1rem; + text-align: center; + line-height: 40px; + color: #333; + cursor: pointer; + -webkit-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; +} + +.grid-shuffle:hover { + background-color: #1ABC9C; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); +} + + +/* Portfolio - Items +-----------------------------------------------------------------*/ + +.portfolio, +.portfolio-item { + position: relative; +} + +.portfolio-rounded .portfolio-image { + border-radius: 5px; + overflow: hidden; +} + +body:not(.device-touch) .portfolio { + -webkit-transition: height .4s linear; + -o-transition: height .4s linear; + transition: height .4s linear; +} + +.portfolio-reveal .portfolio-item { overflow: hidden; } + +.portfolio-item .portfolio-image { + position: relative; + overflow: hidden; +} + +.portfolio-item .portfolio-image, +.portfolio-item .portfolio-image > a, +.portfolio-item .portfolio-image img { + display: block; + width: 100%; + height: auto; +} + +@media (min-width: 768px) { + .portfolio-reveal .portfolio-image img, + .portfolio-reveal .bg-overlay { + -webkit-transition: all .3s ease-in-out; + -o-transition: all .3s ease-in-out; + transition: all .3s ease-in-out; + } +} + + +/* Portfolio - Item Title +-----------------------------------------------------------------*/ + +.portfolio-desc { + position: relative; + z-index: 6; + padding: 20px 5px; +} + +.portfolio-desc h3 { + margin: 0; + padding: 0; + font-size: 1.25rem; +} + +.portfolio-desc h3 a { + color: #222; +} + +.portfolio-desc h3 a:hover { + color: #1ABC9C; +} + +.portfolio-desc span { + display: block; +} + +.portfolio-desc span, +.portfolio-desc span a { + color: #888; +} + +.portfolio-desc span a:hover { + color: #000; +} + + +.desc-lg .portfolio-desc { + padding: 20px 8px; +} + +.desc-lg .portfolio-desc h3 { + font-size: 1.5rem; +} + +.desc-lg .portfolio-desc span { + font-size: 110%; +} + + +.desc-sm .portfolio-desc { + padding: 15px 5px; +} + +.desc-sm .portfolio-desc h3 { + font-size: 1rem; +} + +.desc-sm .portfolio-desc span { + font-size: 90%; +} + +.portfolio.g-0 .portfolio-desc { + padding-left: 15px; + padding-right: 15px; +} + +.portfolio.desc-sm.g-0 .portfolio-desc { + padding-left: 10px; + padding-right: 10px; +} + +.portfolio-reveal .portfolio-desc { + background-color: #FFF; + top: -100%; + -webkit-transform: translateY(100%); + transform: translateY(100%); +} + +@media (min-width: 768px) { + .portfolio-reveal .portfolio-desc { + -webkit-transition: all .3s ease-in-out; + -o-transition: all .3s ease-in-out; + transition: all .3s ease-in-out; + } +} + +.portfolio-reveal .portfolio-item:hover .portfolio-desc { + -webkit-transform: translateY(0); + transform: translateY(0); +} + +.portfolio-reveal .portfolio-item:hover .portfolio-image img, +.portfolio-reveal .portfolio-item:hover .bg-overlay { + -webkit-transform: translateY(0); + transform: translateY(0); +} + +@media (min-width: 768px) { + .portfolio-reveal .portfolio-item:hover .portfolio-image img, + .portfolio-reveal .portfolio-item:hover .bg-overlay { + -webkit-transform: translateY(-15%); + transform: translateY(-15%); + } +} + +@media (max-width: 767.98px) { + .portfolio-reveal .portfolio-desc, + .portfolio-reveal .portfolio-desc { display: none !important; } +} + + +.col-md-9 .portfolio-desc h3 { + font-size: 1.125rem; +} + +.col-md-9 .portfolio-desc span { + font-size: 0.875rem; +} + + +/* Portfolio - Parallax +-----------------------------------------------------------------*/ + +.portfolio-parallax .portfolio-image { + height: 60vh; + background-attachment: fixed; +} + +@media( min-width: 992px ) { + .portfolio-parallax .portfolio-image { + height: 500px; + } +} + + +/* Portfolio Single +-----------------------------------------------------------------*/ + +.portfolio-single {} + + +/* Portfolio Single - Image +-----------------------------------------------------------------*/ + +.portfolio-single-image > a, +.portfolio-single-image .slide a, +.portfolio-single-image img, +.portfolio-single-image iframe, +.portfolio-single-image video { + display: block; + width: 100%; +} + +.portfolio-single-image-full { + position: relative; + height: 600px; + overflow: hidden; + margin: -80px 0 80px !important; +} + +.portfolio-single-video { height: auto !important; } + + +/* Masonry Thumbs +-----------------------------------------------------------------*/ + +.masonry-thumbs { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-left: -1px; + margin-right: -1px; + margin-bottom: -2px; +} + +.masonry-thumbs .grid-item { + display: block; + position: relative; + width: 25%; + max-width: 100%; + height: auto; + overflow: hidden; + padding-left: 1px; + padding-right: 1px; + padding-bottom: 2px; + padding-top: 0; +} + +.masonry-gap-0 { + margin: 0; +} + +.masonry-gap-0 .grid-item { + padding: 0; +} + +.masonry-gap-lg { + margin-left: -3px; + margin-right: -3px; + margin-bottom: -6px; +} + +.masonry-gap-lg .grid-item { + padding-left: 3px; + padding-right: 3px; + padding-bottom: 6px; +} + +.masonry-gap-xl { + margin-left: -5px; + margin-right: -5px; + margin-bottom: -10px; +} + +.masonry-gap-xl .grid-item { + padding-left: 5px; + padding-right: 5px; + padding-bottom: 10px; +} + +.grid-item > img, +.grid-item .grid-inner > img { + width: 100%; + height: auto; + border-radius: 0; +} + +.grid-1 > .grid-item { + width: 100%; +} + +.grid-2 > .grid-item { + width: 50%; +} + +.grid-3 > .grid-item { + width: 33.333333%; +} + +.grid-4 > .grid-item { + width: 25%; +} + +.grid-5 > .grid-item { + width: 20%; +} + +.grid-6 > .grid-item { + width: 16.666667%; +} + +.grid-8 > .grid-item { + width: 12.50%; +} + +.grid-10 > .grid-item { + width: 10%; +} + +.grid-12 > .grid-item { + width: 8.333333%; +} + +@media (min-width: 576px) { + .grid-sm-1 > .grid-item { + width: 100%; + } + + .grid-sm-2 > .grid-item { + width: 50%; + } + + .grid-sm-3 > .grid-item { + width: 33.333333%; + } + + .grid-sm-4 > .grid-item { + width: 25%; + } + + .grid-sm-5 > .grid-item { + width: 20%; + } + + .grid-sm-6 > .grid-item { + width: 16.666667%; + } + + .grid-sm-8 > .grid-item { + width: 12.50%; + } + + .grid-sm-10 > .grid-item { + width: 10%; + } + + .grid-sm-12 > .grid-item { + width: 8.333333%; + } +} + +@media (min-width: 768px) { + .grid-md-1 > .grid-item { + width: 100%; + } + + .grid-md-2 > .grid-item { + width: 50%; + } + + .grid-md-3 > .grid-item { + width: 33.333333%; + } + + .grid-md-4 > .grid-item { + width: 25%; + } + + .grid-md-5 > .grid-item { + width: 20%; + } + + .grid-md-6 > .grid-item { + width: 16.666667%; + } + + .grid-md-8 > .grid-item { + width: 12.50%; + } + + .grid-md-10 > .grid-item { + width: 10%; + } + + .grid-md-12 > .grid-item { + width: 8.333333%; + } +} + +@media (min-width: 992px) { + .grid-lg-1 > .grid-item { + width: 100%; + } + + .grid-lg-2 > .grid-item { + width: 50%; + } + + .grid-lg-3 > .grid-item { + width: 33.333333%; + } + + .grid-lg-4 > .grid-item { + width: 25%; + } + + .grid-lg-5 > .grid-item { + width: 20%; + } + + .grid-lg-6 > .grid-item { + width: 16.666667%; + } + + .grid-lg-8 > .grid-item { + width: 12.50%; + } + + .grid-lg-10 > .grid-item { + width: 10%; + } + + .grid-lg-12 > .grid-item { + width: 8.333333%; + } +} + +@media (min-width: 1200px) { + .grid-xl-1 > .grid-item { + width: 100%; + } + + .grid-xl-2 > .grid-item { + width: 50%; + } + + .grid-xl-3 > .grid-item { + width: 33.333333%; + } + + .grid-xl-4 > .grid-item { + width: 25%; + } + + .grid-xl-5 > .grid-item { + width: 20%; + } + + .grid-xl-6 > .grid-item { + width: 16.666667%; + } + + .grid-xl-8 > .grid-item { + width: 12.50%; + } + + .grid-xl-10 > .grid-item { + width: 10%; + } + + .grid-xl-12 > .grid-item { + width: 8.333333%; + } +} + +@media (min-width: 1400px) { + .grid-xxl-1 > .grid-item { + width: 100%; + } + + .grid-xxl-2 > .grid-item { + width: 50%; + } + + .grid-xxl-3 > .grid-item { + width: 33.333333%; + } + + .grid-xxl-4 > .grid-item { + width: 25%; + } + + .grid-xxl-5 > .grid-item { + width: 20%; + } + + .grid-xxl-6 > .grid-item { + width: 16.666667%; + } + + .grid-xxl-8 > .grid-item { + width: 12.50%; + } + + .grid-xxl-10 > .grid-item { + width: 10%; + } + + .grid-xxl-12 > .grid-item { + width: 8.333333%; + } +} + + +/* Portfolio Single - Content +-----------------------------------------------------------------*/ + +.portfolio-single-content h2 { + margin: 0 0 20px; + padding: 0; + font-size: 1.25rem; + font-weight: 600 !important; +} + +.modal-padding { padding: 40px; } + +.ajax-modal-title { + background-color: #F9F9F9; + border-bottom: 1px solid #EEE; + padding: 25px 40px; +} + +.ajax-modal-title h2 { + font-size: 1.75rem; + margin-bottom: 0; +} + + +#portfolio-ajax-wrap { + position: relative; + max-height: 0; + overflow: hidden; + -webkit-transition: max-height .4s ease; + -o-transition: max-height .4s ease; + transition: max-height .4s ease; +} + +#portfolio-ajax-wrap.portfolio-ajax-opened { max-height: 1200px; } + +#portfolio-ajax-container { + display: none; + padding-bottom: 60px; +} + +#portfolio-ajax-title h2 { font-size: 1.75rem; } + + +/* Portfolio Single - Meta +-----------------------------------------------------------------*/ + +.portfolio-meta, +.portfolio-share { + list-style: none; + font-size: 0.875rem; +} + +.portfolio-meta li { + margin: 10px 0; + color: #666; +} + +.portfolio-meta li:first-child { margin-top: 0; } + +.portfolio-meta li span { + display: inline-block; + width: 150px; + font-weight: bold; + color: #333; +} + +.portfolio-meta li span i { + position: relative; + top: 1px; + width: 14px; + text-align: center; + margin-right: 7px; +} + + +/* Portfolio Single Navigation +-----------------------------------------------------------------*/ + +#portfolio-navigation { + position: absolute; + top: 50%; + left: auto; + right: 10px; + max-width: 96px; + height: 24px; + margin-top: -12px; +} + +.page-title-right #portfolio-navigation { + left: 10px; + right: auto; +} + +.page-title-center #portfolio-navigation { + position: relative; + top: 0; + left: 0; + margin: 20px auto 0; +} + +#portfolio-navigation a { + display: block; + float: left; + margin-left: 12px; + width: 24px; + height: 24px; + text-align: center; + color: #444; + transition: color .3s linear; + -webkit-transition: color .3s linear; + -o-transition: color .3s linear; +} + +.page-title-dark #portfolio-navigation a { color: #EEE; } + +.page-title-parallax #portfolio-navigation a { color: #FFF; } + +#portfolio-navigation a i { + position: relative; + top: -1px; + font-size: 1.5rem; + line-height: 1; +} + +#portfolio-navigation a i.icon-angle-left, +#portfolio-navigation a i.icon-angle-right { + font-size: 32px; + top: -6px; +} + +#portfolio-navigation a i.icon-angle-right { left: -1px; } + +#portfolio-navigation a:first-child { margin-left: 0; } + +#portfolio-navigation a:hover { color: #1ABC9C; } + +#portfolio-ajax-show #portfolio-navigation { + top: 0; + margin-top: 0; +} + + +/* ---------------------------------------------------------------- + Blog +-----------------------------------------------------------------*/ + + +#posts { position: relative; } + +.entry { + position: relative; + margin-bottom: 50px; +} + +.posts-md .entry, +.posts-sm .entry { + margin-bottom: 0; +} + +.entry::after { + content: ''; + position: relative; + height: 2px; + margin-top: 50px; + background-color: #F5F5F5; +} + +.entry-image { margin-bottom: 30px; } + +.posts-md .entry-image, +.posts-sm .entry-image { + margin-bottom: 0; +} + +.entry-image, +.entry-image > a, +.entry-image .slide a, +.entry-image img { + display: block; + position: relative; + width: 100%; + height: auto; +} + +.posts-sm .entry-image { + width: 64px; +} + +.entry-image iframe { display: block; } + +.entry-image video { + display: block; + width: 100%; +} + +.entry-image img { border-radius: 3px; } + +.posts-md .entry-image + .entry-title { + margin-top: 0.875rem; +} + +.entry-title h2, +.entry-title h3, +.entry-title h4 { + margin: 0; + font-size: 1.5rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 1px; +} + +.entry-title.title-sm h2, +.entry-title.title-sm h3 { + font-size: 1.25rem; + letter-spacing: 0; +} + +.entry-title.title-sm h3 { + font-size: 1.125rem; +} + +.entry-title.title-xs h2, +.entry-title.title-xs h3 { + font-size: 1rem; + letter-spacing: 0; +} + +.entry-title h4 { + font-size: 0.875rem; + letter-spacing: 0; +} + +.entry-title.nott h2, +.entry-title.nott h3, +.entry-title h4 { + text-transform: none; +} + +.entry-title h2 a, +.entry-title h3 a, +.entry-title h4 a { color: #333; } + +.entry-title h2 a:hover, +.entry-title h3 a:hover, +.entry-title h4 a:hover { color: #1ABC9C; } + +.entry-meta { + position: relative; + overflow: hidden; + margin-top: 10px; +} + +.posts-sm .entry-meta { + margin-top: 6px; +} + +.single-post .entry-meta { margin-bottom: 20px; } + +.posts-md .entry-meta, +.posts-sm .entry-meta { + margin-bottom: 0px; +} + +.entry-meta ul { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + align-items: center; + margin: 0 0 -10px -20px; + list-style: none; +} + +.entry-meta.no-separator ul, +.entry-meta ul.flex-column { + align-items: start; + margin-left: 0; +} + +.posts-sm .entry-meta ul { + margin-bottom: -5px; +} + +.entry-meta li { + font-size: 90%; + margin: 0 15px 10px 0; + color: #999; +} + +.entry-meta ul.flex-column li { + margin-left: 0; +} + +.posts-sm .entry-meta li { + margin-bottom: 5px; +} + +.entry-meta:not(.no-separator) li::before { + content: '\205E'; + width: 5px; + text-align: center; + display: inline-block; + margin-right: 15px; + opacity: 0.5; +} + +.entry-meta i { + position: relative; + top: 1px; + padding-left: 1px; + margin-right: 5px; +} + +.entry-meta a:not(:hover) { color: #999; } + +.entry-meta ins { + font-weight: 700; + text-decoration: none; +} + +.entry-content { margin-top: 30px; } + +.single-post .entry-content { margin-top: 0; } + +.posts-md .entry-content, +.posts-sm .entry-content { + margin-top: 20px; +} + +.single-post .entry-content .entry-image { max-width: 350px; } + +.entry-content { position: relative; } + +.entry-link { + display: block; + width: 100%; + background-color: #F5F5F5; + padding: 30px 0; + text-align: center; + color: #444; + font-family: 'Poppins', sans-serif; + text-transform: uppercase; + letter-spacing: 1px; + font-size: 1.5rem; + font-weight: 700; + border-radius: 3px; +} + +body:not(.device-touch) .entry-link { + -webkit-transition: background-color .3s ease-in-out; + -o-transition: background-color .3s ease-in-out; + transition: background-color .3s ease-in-out; +} + +.entry-link:hover { + color: #FFF; + background-color: #1ABC9C; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); +} + +.entry-link span { + display: block; + margin-top: 5px; + font-family: 'PT Serif', serif; + font-style: italic; + font-weight: normal; + text-transform: none; + letter-spacing: 0; + font-size: 0.875rem; + color: #AAA; +} + +.entry-link:hover span { color: #EEE; } + +.entry blockquote p { + font-weight: 400; + font-family: 'PT Serif', serif; + font-style: italic; +} + + +/* Blog - Grid +-----------------------------------------------------------------*/ + +.post-grid .entry { + margin-bottom: 30px; +} + +.post-grid .entry-title h2 { + font-size: 1.125rem; + letter-spacing: 0; + font-weight: 600; +} + +.post-grid .entry-link { font-size: 1.5rem; } + +.post-grid .entry-link span { font-size: 0.875rem; } + + +/* Blog - Timeline +-----------------------------------------------------------------*/ + +.entry-timeline { + display: none; +} + +@media (min-width: 992px) { + + .timeline-border { + position: absolute; + top: 0; + left: 50%; + width: 0; + border-left: 1px dashed #CCC; + height: 100%; + transform: translateX(-50%); + } + + .postcontent .post-timeline::before { + content: ''; + position: absolute; + top: 0; + left: 50%; + width: 0; + border-left: 1px dashed #CCC; + height: 100%; + } + + .post-timeline .entry-timeline { + display: none; + position: absolute; + border: 2px solid #CCC; + background-color: #FFF; + padding-top: 0; + text-indent: -9999px; + top: 40px; + left: auto; + right: -6px; + width: 13px; + height: 13px; + border-radius: 50%; + font-size: 1.75rem; + font-weight: bold; + color: #AAA; + text-align: center; + line-height: 1; + -webkit-transition: all .3s ease-in-out; + -o-transition: all .3s ease-in-out; + transition: all .3s ease-in-out; + } + + .post-timeline .entry-timeline .timeline-divider { + position: absolute; + top: 4px; + left: auto; + right: 15px; + width: 70px; + height: 0; + border-top: 1px dashed #CCC; + -webkit-transition: all .3s ease-in-out; + -o-transition: all .3s ease-in-out; + transition: all .3s ease-in-out; + } + + .post-timeline .entry:not(.entry-date-section) { + padding-right: 85px; + } + + .post-timeline .entry.alt:not(.entry-date-section) { + padding-right: inherit; + padding-left: 85px; + } + + .post-timeline .alt .entry-timeline { + right: auto; + left: -6px; + } + + .post-timeline .alt .entry-timeline .timeline-divider { + left: 15px; + right: auto; + } + + .post-timeline .entry-timeline span { + display: block; + margin-top: 3px; + font-size: 13px; + font-weight: normal; + } + + .post-timeline .entry:hover .entry-timeline, + .post-timeline .entry:hover .timeline-divider { + border-color: #1ABC9C; + color: #1ABC9C; + } + +} + +.entry.entry-date-section { + margin: 50px 0 80px; + text-align: center; +} + +.entry.entry-date-section:first-child { + margin-top: 0; +} + +.entry.entry-date-section span { + display: inline-block; + width: 250px; + background-color: #FFF; + border: 2px solid #EEE; + font-size: 18px; + line-height: 50px; + font-weight: bold; + letter-spacing: 1px; + text-transform: uppercase; + font-family: 'Poppins', sans-serif; +} + +@media (min-width: 992px) { + + /* Blog - Timeline - Sidebar + -----------------------------------------------------------------*/ + + .postcontent .post-timeline::before { + left: -68px; + margin-left: 0; + } + + .postcontent .post-timeline { + padding-left: 0; + margin-left: 100px; + margin-right: 0 !important; + overflow: visible; + } + + .postcontent .post-timeline .entry { + width: 100% !important; + padding: 0 !important; + } + + .postcontent .post-timeline .entry-timeline { + display: block; + border: 3px solid #CCC; + background-color: #FFF; + padding-top: 10px; + text-indent: 0; + top: 20px; + left: -100px; + right: auto; + width: 64px; + height: 64px; + font-size: 1.5rem; + } + + .postcontent .post-timeline .entry-timeline div.timeline-divider { + top: 29px; + left: 64px; + width: 32px; + } + +} + +.more-link { + display: inline-block; + border-bottom: 1px solid #1ABC9C; + padding: 0 2px; + font-family: 'PT Serif', serif; + font-style: italic; +} + +.more-link:hover { border-bottom-color: #555; } + +.post-navigation + .line { margin-top: 50px; } + + +/* ---------------------------------------------------------------- + Blog - Author +-----------------------------------------------------------------*/ + +.author-image { + float: left; + width: 64px; + height: 64px; + margin-right: 15px; +} + +.author-image img { + width: 64px; + height: 64px; +} + +.author-desc { + position: relative; + overflow: hidden; +} + + +/* ---------------------------------------------------------------- + Comments List +-----------------------------------------------------------------*/ + + +#comments { + position: relative; + margin-top: 50px; + padding-top: 50px; + border-top: 1px solid #EEE; +} + +.commentlist { + list-style: none; + padding-bottom: 50px; + margin: 0 0 50px; + border-bottom: 1px solid #EEE; +} + +#reviews .commentlist { + padding-bottom: 30px; + margin: 0 0 20px; +} + +.commentlist ul { list-style: none; } + +.commentlist li, +.commentlist li ul, +.commentlist li ul li { margin: 30px 0 0 0; } + +.commentlist ul:first-child { margin-top: 0; } + +.commentlist li { + position: relative; + margin: 30px 0 0 30px; +} + +#reviews .commentlist li { margin-top: 20px; } + +.comment-wrap { + position: relative; + border: 1px solid #E5E5E5; + border-radius: 5px; + padding: 20px 20px 20px 35px; +} + +.commentlist ul .comment-wrap { + margin-left: 25px; + padding-left: 20px; +} + +#reviews .comment-wrap { + border: 0; + padding: 10px 0 0 35px; +} + +.commentlist > li:first-child, +#reviews .commentlist > li:first-child { + padding-top: 0; + margin-top: 0; +} + +.commentlist li .children { margin-top: 0; } + +.commentlist li li .children { margin-left: 30px; } + +.commentlist li .comment-content, +.pingback { + position: relative; + overflow: hidden; +} + +.commentlist li .comment-content p, +.pingback p { margin: 20px 0 0 0; } + +.commentlist li .comment-content { padding: 0 0 0 15px; } + +.commentlist li .comment-meta { + float: left; + margin-right: 0; + line-height: 1; +} + +.comment-avatar { + position: absolute; + top: 15px; + left: -35px; + padding: 4px; + background: #FFF; + border: 1px solid #E5E5E5; + border-radius: 50%; +} + +.comment-avatar img { + display: block; + border-radius: 50%; +} + +.commentlist li .children .comment-avatar { left: -25px; } + +.comment-content .comment-author { + margin-bottom: -10px; + font-size: 1rem; + font-weight: bold; + color: #555; +} + +.comment-content .comment-author a { + border: none; + color: #333; +} + +.comment-content .comment-author a:hover { color: #1ABC9C; } + +.comment-content .comment-author span { display: block; } + +.comment-content .comment-author span, +.comment-content .comment-author span a { + font-size: 12px; + font-weight: normal; + font-family: 'PT Serif', serif; + font-style: italic; + color: #AAA; +} + +.comment-content .comment-author span a:hover { color: #888; } + +.comment-reply-link, +.review-comment-ratings { + display: block; + position: absolute; + top: 4px; + left: auto; + text-align: center; + right: 0px; + width: 14px; + height: 14px; + color: #CCC; + font-size: 0.875rem; + line-height: 1; +} + +.review-comment-ratings { + width: auto; + color: #333; +} + +.comment-reply-link:hover { color: #888; } + + +/* ---------------------------------------------------------------- + Comment Form +-----------------------------------------------------------------*/ + + +#respond, +#respond form { margin-bottom: 0; } + +.commentlist li #respond { margin: 30px 0 0; } + +.commentlist li li #respond { margin-left: 30px; } + +#respond p { margin: 10px 0 0 0; } + +#respond p:first-child { margin-top: 0; } + +#respond label small { + color: #999; + font-weight: normal; +} + +#respond input[type="text"], +#respond textarea { margin-bottom: 0; } + +.fb-comments, +.fb_iframe_widget, +.fb-comments > span, +.fb_iframe_widget > span, +.fb-comments > span > iframe, +.fb_iframe_widget > span > iframe { + display: block !important; + width: 100% !important; + margin: 0; +} + + +/* Post Elements +-----------------------------------------------------------------*/ + +img.alignleft, +div.alignleft { + float: left; + margin: 5px 20px 13px 0; + max-width: 100%; +} + +div.alignleft > img, +div.alignnone > img, +div.aligncenter > img, +div.alignright > img { + display: block; + float: none; +} + +img.alignnone, +img.aligncenter, +div.alignnone, +div.aligncenter { + display: block; + margin: 10px 0; + float: none; +} + +img.aligncenter, +div.aligncenter, +div.aligncenter img { + margin-left: auto; + margin-right: auto; + clear: both; +} + +img.alignright, +div.alignright { + float: right; + margin: 5px 0 13px 20px; +} + +.wp-caption { + text-align: center; + margin: 10px 20px 13px 20px; + font-family: 'Lato', Georgia, "Times New Roman", Times, serif; + font-style: italic; +} + +.wp-caption img, +.wp-caption img a { + display: block; + margin: 0; +} + +p.wp-caption-text { + display: inline-block; + margin: 10px 0 0 0; + padding: 5px 10px; + background-color: #EEE; + border-radius: 50px; +} + +.wp-smiley { + max-height: 13px; + margin: 0 !important; +} + + +/* Infinity Scroll - Message Style +-----------------------------------------------------------------*/ + +#infscr-loading, +#portfolio-ajax-loader { + position: fixed; + z-index: 20; + top: 50%; + left: 50%; + width: 48px; + height: 48px; + margin: -24px 0 0 -24px; + background-color: rgba(0,0,0,0.7); + border-radius: 3px; + line-height: 48px; + font-size: 1.5rem; + color: #FFF; + text-align: center; +} + +#infscr-loading img, +#portfolio-ajax-loader img { + display: none; + width: 24px; + height: 24px; + margin: 12px; +} + +#portfolio-ajax-loader { display: none; } + +#portfolio-ajax-loader img { display: block; } + +.page-load-status { + position: relative; + display: none; + padding: 30px 0; +} + +.page-load-status .css3-spinner-ball-pulse-sync > div { background-color: #333; } + + +/* ---------------------------------------------------------------- + Shop +-----------------------------------------------------------------*/ + + +.shop, +.product { + position: relative; +} + +.product .product-image { + position: relative; + overflow: hidden; +} + +.product-image > a, +.product-image .slide a, +.product-image img { + display: block; + width: 100%; +} + +body:not(.device-touch):not(.device-sm):not(.device-xs) .product-image > a { + -webkit-transition: all .5s ease; + -o-transition: all .5s ease; + transition: all .5s ease; +} + +.product-image > a:nth-of-type(2) { + opacity: 0; + position: absolute; + z-index: -1; + top: 0; + left: 0; +} + +.product-image:hover > a:nth-of-type(2) { + opacity: 1; + z-index: 2; +} + +.product-desc { + padding: 15px 0; +} + +.product-title { margin-bottom: 7px; } + +.product-title h3 { + margin: 0; + font-size: 1.25rem; +} + +.product-title h3 a, +.single-product .product-title h2 a { color: #333; } + +.product-title h3 a:hover, +.single-product .product-title h2 a:hover { color: #1ABC9C; } + +.product-price { + font-size: 1.125rem; + font-weight: 700; + color: #444; + margin-bottom: 4px; +} + +.product-price del { + font-weight: 400; + font-size: 90%; + color: #888; +} + +.product-price ins { + text-decoration: none; + color: #1ABC9C; +} + +.product-image > .badge, +.sale-flash { + position: absolute; + top: 10px; + left: 10px; + z-index: 5; +} + + +/* Shop - Single +-----------------------------------------------------------------*/ + +.single-product .product { + width: 100%; + margin: 0; +} + +.shop-quick-view-ajax, +.portfolio-ajax-modal { + position: relative; + background-color: #FFF; + width: auto; + max-width: 800px; + margin: 0 auto; +} + +.portfolio-ajax-modal { + max-width: 1000px; +} + +.single-product .product-image, +.single-product .product-image img { height: auto; } + +.single-product .product-title h2 { + font-size: 1.75rem; + margin-bottom: 8px; +} + +.single-product .product-price { + font-size: 1.5rem; + color: #1ABC9C; + margin-bottom: 0; +} + +.single-product .product-desc .line { margin: 20px 0; } + +.quantity { + display: -ms-inline-flexbox; + display: inline-flex; + justify-content: center; + align-items: stretch; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: 30px; +} + +.quantity input[type=number]::-webkit-inner-spin-button, +.quantity input[type=number]::-webkit-outer-spin-button { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + margin: 0; +} + +.quantity .qty { + width: 50px; + height: 40px; + line-height: 40px; + border: 0; + border-left: 1px solid #DDD; + border-right: 1px solid #DDD; + background-color: #EEE; + text-align: center; + margin-bottom: 0; +} + +.quantity .plus, +.quantity .minus { + display: block; + cursor: pointer; + border: 0px transparent; + padding: 0; + width: 36px; + height: 40px; + line-height: 40px; + text-align: center; + background-color: #EEE; + font-size: 1rem; + font-weight: bold; + transition: background-color .2s linear; + -webkit-transition: background-color .2s linear; + -o-transition: background-color .2s linear; +} + +.quantity .plus:hover, +.quantity .minus:hover { background-color: #DDD; } + +.quantity .qty:focus, +.quantity .plus:focus, +.quantity .minus:focus { + box-shadow: none !important; + outline: 0 !important; +} + +.product-meta { + font-size: 90%; + color: #777; +} + +.product-meta > .card-body > span { + display: inline-block; + margin: 0 5px; +} + + +.single-product .fbox-plain.fbox-sm .fbox-icon { + width: 2.25rem; +} + +.single-product .fbox-plain.fbox-sm .fbox-icon i { + font-size: 1.125rem; + line-height: 1.5; +} + + +/* ---------------------------------------------------------------- + Cart +-----------------------------------------------------------------*/ + + +.cart .remove { + font-size: 0.875rem; + color: #FF0000; +} + +.cart .remove:hover { color: #000; } + +.cart th { + padding: 12px 15px !important; + color: #555; +} + +.cart td { + padding: 12px 15px !important; + vertical-align: middle !important; + border-color: #E5E5E5 !important; +} + +.cart-product-thumbnail a { + display: block; + width: 68px; +} + +.cart-product-thumbnail img { + display: block; + width: 64px; + height: 64px; + border: 2px solid #EEE; +} + +.cart-product-thumbnail img:hover { border-color: #1ABC9C; } + +.cart-product-name a, +.product-name a { + font-weight: bold; + font-size: 0.9375rem; + color: #333; +} + +.cart-product-name a:hover, +.product-name a:hover { color: #666; } + +.cart-product-price, +.cart-product-quantity, +.cart-product-subtotal { text-align: center !important; } + +.cart-product-quantity .quantity { + margin: 0; +} + +td.actions { + padding: 20px 15px !important; + vertical-align: top !important; + background-color: #F5F5F5; +} + + +@media (max-width: 767.98px) { + + .cart:not(.cart-totals) thead th { + display: none; + } + + .cart:not(.cart-totals) tbody td { + display: block; + width: 100%; + border: 0; + padding: 0 !important; + text-align: center; + } + + .cart:not(.cart-totals) .cart_item { + display: block; + position: relative; + border: 1px solid #EEE; + margin-bottom: 1.5rem; + padding: 1.5rem; + } + + .cart:not(.cart-totals) .cart_item .cart-product-remove { + display: block; + position: absolute; + top: 1.25rem; + left: auto; + right: 1.25rem; + width: 1.25rem; + height: 1.25rem; + } + + .cart:not(.cart-totals) .cart-product-thumbnail, + .cart:not(.cart-totals) .cart-product-name, + .cart:not(.cart-totals) .cart-product-quantity { + margin-bottom: 1rem; + } + + .cart:not(.cart-totals) .cart_item .cart-product-thumbnail a { + display: inline-block; + } + + .cart:not(.cart-totals) .cart_item .cart-product-price { + display: none; + } + + .cart:not(.cart-totals) .cart_item .cart-product-name a { + font-size: 1rem; + } + + .cart:not(.cart-totals) .cart_item .cart-product-subtotal { + font-size: 1.25rem; + color: #1ABC9C; + } + + .quantity .qty { + width: 42px; + } + + .quantity .qty, + .quantity .plus, + .quantity .minus { + font-size: 0.875rem; + } + +} + + +/* ---------------------------------------------------------------- + Events +-----------------------------------------------------------------*/ + + +.event.entry::after { + display: none !important; +} + +.event .grid-inner { + background-color: #F9F9F9; + border-bottom: 3px solid #EEE; +} + +.event .entry-image .entry-date { + position: absolute; + top: 10px; + left: 10px; + background-color: rgba(0,0,0,0.7); + color: #FFF; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); + width: 60px; + height: 64px; + text-align: center; + padding-top: 9px; + font-size: 1.75rem; + line-height: 1; +} + +.event .entry-image .entry-date span { + display: block; + font-size: 12px; + margin-top: 7px; +} + +.single-event .event-meta .iconlist li, +.parallax .iconlist li { margin: 5px 0; } + +.single-event .entry-overlay, +.parallax .entry-overlay-meta { + position: absolute; + top: auto; + bottom: 0; + left: 0; + width: 100%; + height: 80px; + background-color: rgba(0,0,0,0.85); + text-align: center; + line-height: 80px; + font-size: 1.25rem; + color: #FFF; + z-index: 5; +} + +.single-event .countdown-section { + padding: 0 15px; + border-left-color: rgba(255,255,255,0.3); + color: #CCC; +} + +.single-event .countdown-amount { color: #FFF; } + +.parallax .entry-overlay, +.parallax .entry-overlay-meta { + background: transparent; + width: auto; + text-align: right; + bottom: 30px; + left: auto; + right: 30px; +} + +.parallax .entry-overlay-meta { + padding: 20px; + font-size: 0.875rem; + text-align: left; + right: 38px; + bottom: 130px; + width: 368px; + height: auto; + line-height: inherit; + background-color: rgba(0,0,0,0.7); + border-radius: 3px; +} + +.parallax.overlay-left .entry-overlay, +.parallax.overlay-left .entry-overlay-meta { + right: auto; + left: 30px; +} + +.parallax.overlay-left .entry-overlay-meta { left: 38px; } + +@media (max-width: 575.98px) { + .parallax .entry-overlay-meta, + .parallax .entry-overlay { + left: 0 !important; + right: 0 !important; + width: 90%; + margin: 0 auto; + } +} + +.parallax.overlay-center .entry-overlay, +.parallax.overlay-center .entry-overlay-meta { + bottom: 100px; + right: auto; + left: 50%; + margin-left: -192px; +} + +.parallax.overlay-center .entry-overlay-meta { + top: 100px; + bottom: auto; + margin-left: -184px; +} + +.parallax .entry-overlay-meta h2 { + font-size: 1.25rem; + text-transform: uppercase; + border-bottom: 1px dashed rgba(255,255,255,0.2); + padding-bottom: 17px; +} + +.parallax .entry-overlay-meta h2 a { color: #FFF; } + +.parallax .entry-overlay-meta h2 a:hover { color: #DDD; } + +.parallax .countdown { top: 0; } + +.parallax .countdown-section { + border-left: 0; + width: 80px; + height: 80px; + margin: 0 8px; + font-size: 13px; + background-color: rgba(0,0,0,0.7); + border-radius: 3px; + padding-top: 14px; +} + +.parallax .countdown-amount { + font-size: 28px; + margin-bottom: 6px; +} + + +/* ---------------------------------------------------------------- + + Countdown + +-----------------------------------------------------------------*/ + +.countdown { + position: relative; + display: block; +} + +.countdown-row { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; +} + +.countdown-section { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + font-size: 11px; + line-height: 1; + text-align: center; + border-left: 1px dotted #BBB; + color: #888; + text-transform: capitalize; +} + +.countdown-section:first-child { border-left: 0; } + +.countdown-amount { + display: block; + font-size: 1.25rem; + color: #333; + margin-bottom: 5px; +} + +.countdown-descr { + display: block; + width: 100%; +} + + +/* Countdown - Medium +-----------------------------------------------------------------*/ + +.countdown-medium .countdown-section { font-size: 0.875rem; } + +.countdown-medium .countdown-amount { + font-size: 30px; + margin-bottom: 7px; +} + + +/* Countdown - Large +-----------------------------------------------------------------*/ + +.countdown-large .countdown-section { font-size: 18px; } + +.countdown-large .countdown-amount { + font-size: 44px; + font-weight: 700; + margin-bottom: 8px; +} + + +/* Countdown - Inline +-----------------------------------------------------------------*/ + +.countdown.countdown-inline { display: inline-block; } + +.countdown.countdown-inline .countdown-row { + display: inline-block; + text-align: center; +} + +.countdown.countdown-inline .countdown-section { + display: inline-block; + font-size: inherit; + line-height: inherit; + width: auto; + border: none; + color: inherit; + margin-left: 7px; + text-transform: inherit; +} + +.countdown.countdown-inline .countdown-section:first-child { margin-left: 0; } + +.countdown.countdown-inline .countdown-amount { + display: inline-block; + font-size: inherit; + color: inherit; + font-weight: bold; + margin: 0 3px 0 0; +} + +.countdown.countdown-inline .countdown-descr { + display: inline-block; + width: auto; +} + + +@media (min-width: 768px) { + + /* Countdown - Coming Soon + -----------------------------------------------------------------*/ + + .countdown.countdown-large.coming-soon .countdown-section { + border: none; + padding: 15px; + } + + .countdown.countdown-large.coming-soon .countdown-amount { + width: 140px; + height: 140px; + line-height: 140px; + margin-left: auto; + margin-right: auto; + border-radius: 50%; + background-color: rgba(0,0,0,0.2); + margin-bottom: 15px !important; + } + +} + +/* ---------------------------------------------------------------- + Buttons +-----------------------------------------------------------------*/ + + +.button { + display: inline-block; + position: relative; + cursor: pointer; + outline: none; + white-space: nowrap; + margin: 5px; + padding: 8px 22px; + font-size: 0.875rem; + line-height: 24px; + background-color: #1ABC9C; + color: #FFF; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 1px; + border: none; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); +} + +body:not(.device-touch) .button { + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} + +.button.button-dark { + background-color: #444; +} + +.button.button-light { + background-color: #EEE; + color: #333; + text-shadow: none !important; +} + +.button:hover { + background-color: #444; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); +} + +.button.button-dark:hover { background-color: #1ABC9C; } + +.button.button-mini { + padding: 4px 14px; + font-size: 11px; + line-height: 20px; +} + +.button.button-small { + padding: 7px 17px; + font-size: 12px; + line-height: 20px; +} + +.button.button-large { + padding: 8px 26px; + font-size: 1rem; + line-height: 30px; +} + +.button.button-xlarge { + padding: 9px 32px; + font-size: 18px; + letter-spacing: 2px; + line-height: 34px; +} + +.button.button-desc { + text-align: left; + padding: 24px 34px; + font-size: 1.25rem; + height: auto; + line-height: 1; + font-family: 'Poppins', sans-serif; +} + +.button.button-desc span { + display: block; + margin-top: 10px; + font-size: 0.875rem; + font-weight: 400; + letter-spacing: 1px; + font-family: 'PT Serif', serif; + font-style: italic; + text-transform: none; +} + +.button i { + position: relative; + margin-right: 5px; + width: 16px; + text-align: center; +} + +.button.text-end i { margin: 0 0 0 5px; } + +.button-mini i { margin-right: 3px; } + +.button-mini.text-end i { margin: 0 0 0 3px; } + +.button-small i { margin-right: 4px; } + +.button-small.text-end i { margin: 0 0 0 4px; } + +.button-xlarge i { + margin-right: 8px; +} + +.button-xlarge.text-end i { margin: 0 0 0 8px; } + +.button.button-desc i { + font-size: 48px; + width: 48px; + text-align: center; + margin-right: 12px; +} + +.button.button-desc.text-end i { margin: 0 0 0 12px; } + +.button.button-desc div { display: inline-block; } + +.button.button-rounded { border-radius: 3px; } + + +/* Buttons - Border +-----------------------------------------------------------------*/ + +.button.button-border { + border: 2px solid #444; + background-color: transparent; + color: #333; + font-weight: 700; + text-shadow: none; +} + +.button.button-border-thin { + border-width: 1px; +} + +.button.button-border.button-desc { line-height: 1; } + +.button.button-border:not(.button-fill):hover { + background-color: #444; + color: #FFF; + border-color: transparent !important; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); +} + +.button.button-border.button-light { + border-color: #FFF; + color: #FFF; +} + +.button.button-border.button-light:hover { + background-color: #FFF; + color: #333; + text-shadow: none; +} + + +/* Buttons - Border +-----------------------------------------------------------------*/ + +.button.button-3d { + border-radius: 3px; + box-shadow: inset 0 -3px 0 rgba(0,0,0,0.15); + -webkit-transition: none; + -o-transition: none; + transition: none; +} + +.button.button-3d:hover { + background-color: #1ABC9C; + opacity: 0.9; +} + +.button.button-3d.button-light:hover, +.button.button-reveal.button-light:hover { + text-shadow: none; + color: #333; +} + + +/* Buttons - Icon Reveal +-----------------------------------------------------------------*/ + +.button.button-reveal { + padding-left: 28px; + padding-right: 28px; + overflow: hidden; +} + +.button.button-reveal i { + display: block; + position: absolute; + top: 0; + left: -32px; + width: 32px; + height: 100%; + display: -ms-flexbox; + display: flex; + align-items: center; + justify-content: center; + margin: 0; + background-color: rgba(0,0,0,0.1); +} + +.button.button-reveal.button-border i { top: -2px; } + +.button.button-reveal.text-end i { + left: auto; + right: -32px; +} + +.button.button-reveal.button-3d i, +.button.button-reveal.button-rounded i { border-radius: 3px 0 0 3px; } + +.button.button-reveal.button-3d.text-end i, +.button.button-reveal.button-rounded.text-end i { border-radius: 0 3px 3px 0; } + +.button.button-reveal span { + display: inline-block; + position: relative; + left: 0; +} + +body:not(.device-touch) .button.button-reveal i, +body:not(.device-touch) .button.button-reveal span { + -webkit-transition: left 0.3s ease, right 0.3s ease; + -o-transition: left 0.3s ease, right 0.3s ease; + transition: left 0.3s ease, right 0.3s ease; +} + +.button.button-reveal.button-mini { + padding-left: 17px; + padding-right: 17px; +} + +.button.button-reveal.button-mini i { + left: -22px; + width: 22px; +} + +.button.button-reveal.button-mini.text-end i { + left: auto; + right: -22px; +} + +.button.button-reveal.button-small { + padding-left: 22px; + padding-right: 22px; +} + +.button.button-reveal.button-small i { + left: -26px; + width: 26px; +} + +.button.button-reveal.button-small.text-end i { + left: auto; + right: -26px; +} + +.button.button-reveal.button-large { + padding-left: 32px; + padding-right: 32px; +} + +.button.button-reveal.button-large i { + left: -38px; + width: 38px; +} + +.button.button-reveal.button-large.text-end i { + left: auto; + right: -38px; +} + +.button.button-reveal.button-xlarge { + padding-right: 40px; + padding-left: 40px; +} + +.button.button-reveal.button-xlarge i { + left: -44px; + width: 44px; +} + +.button.button-reveal.button-xlarge.text-end i { + left: auto; + right: -44px; +} + +.button.button-reveal:hover i { left: 0; } + +.button.button-reveal.text-end:hover i { + left: auto; + right: 0; +} + +.button.button-reveal:hover span { left: 16px; } + +.button.button-reveal.button-mini:hover span { left: 11px; } + +.button.button-reveal.button-small:hover span { left: 13px; } + +.button.button-reveal.button-large:hover span { left: 19px; } + +.button.button-reveal.button-xlarge:hover span { left: 22px; } + +.button.button-reveal.text-end:hover span { left: -16px; } + +.button.button-reveal.button-mini.text-end:hover span { left: -11px; } + +.button.button-reveal.button-small.text-end:hover span { left: -13px; } + +.button.button-reveal.button-large.text-end:hover span { left: -19px; } + +.button.button-reveal.button-xlarge.text-end:hover span { left: -22px; } + + +/* Buttons - Promo 100% Width +-----------------------------------------------------------------*/ + +.button.button-full { + display: block; + width: 100%; + white-space: normal; + margin: 0; + height: auto; + line-height: 1.6; + padding: 30px 0; + font-size: 30px; + font-weight: 300; + text-transform: none; + border-radius: 0; + text-shadow: 1px 1px 1px rgba(0,0,0,0.1); +} + +.button.button-full.button-light { border-bottom: 1px solid rgba(0,0,0,0.15); } + +.button.button-full strong { + font-weight: 700; + border-bottom: 2px solid #EEE; +} + +body:not(.device-touch) .button.button-full strong { + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} + +.button.button-full.button-light strong { border-bottom-color: #333; } + +.button.button-full.button-light:hover strong { border-bottom-color: #EEE; } + + +/* Buttons - Circle +-----------------------------------------------------------------*/ + +.button.button-circle { border-radius: 20px; } + +.button.button-mini.button-circle { border-radius: 14px; } + +.button.button-small.button-circle { border-radius: 17px; } + +.button.button-large.button-circle { border-radius: 23px; } + +.button.button-xlarge.button-circle { border-radius: 26px; } + + +/* Buttons - Fill Effect +-----------------------------------------------------------------*/ + +.button.button-border.button-fill { + overflow: hidden; + transform-style: preserve-3d; + -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC); + -webkit-backface-visibility: hidden; +} + +.button.button-border.button-fill span { position: relative; } + +.button.button-border.button-fill:hover { + background-color: transparent !important; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); +} + +.button.button-border.button-fill.button-light:hover { + border-color: #EEE !important; + color: #333 !important; + text-shadow: none; +} + +.button.button-border.button-fill::before { + content: ''; + position: absolute; + background-color: #444; + top: 0; + left: 0; + width: 0; + height: 100%; + -webkit-transition: all .4s ease; + -o-transition: all .4s ease; + transition: all .4s ease; + -webkit-backface-visibility: hidden; +} + +.button.button-border.button-fill.button-light::before { background-color: #EEE; } + +.button.button-border.button-fill.fill-from-right::before { + left: auto; + right: 0; +} + +.button.button-border.button-fill:hover::before { width: 100%; } + +.button.button-border.button-fill.fill-from-top::before, +.button.button-border.button-fill.fill-from-bottom::before { + -webkit-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease; +} + +.button.button-border.button-fill.fill-from-top::before { + width: 100%; + height: 0; +} + +.button.button-border.button-fill.fill-from-top:hover::before { height: 100%; } + +.button.button-border.button-fill.fill-from-bottom::before { + width: 100%; + height: 0; + top: auto; + bottom: 0; +} + +.button.button-border.button-fill.fill-from-bottom:hover::before { height: 100%; } + + +/* Buttons - Colors +-----------------------------------------------------------------*/ + +.button-red:not(.button-border) { background-color: #C02942 !important; } +.button-3d.button-red:hover, +.button-reveal.button-red:hover, +.button-border.button-red:hover, +.button-border.button-red.button-fill::before { background-color: #C02942 !important; } + +.button-border.button-red { + color: #C02942; + border-color: #C02942; +} + +.button-teal:not(.button-border) { background-color: #53777A !important; } +.button-3d.button-teal:hover, +.button-reveal.button-teal:hover, +.button-border.button-teal:hover, +.button-border.button-teal.button-fill::before { background-color: #53777A !important; } + +.button-border.button-teal { + color: #53777A; + border-color: #53777A; +} + +.button-light.button-yellow:not(.button-border) { background-color: #ECD078 !important; } +.button-3d.button-yellow:hover, +.button-reveal.button-yellow:hover, +.button-border.button-yellow:hover, +.button-border.button-yellow.button-fill::before { background-color: #ECD078 !important; } + +.button-border.button-yellow, +.button-border.button-yellow.button-fill.button-light:hover { + color: #ECD078 !important; + border-color: #ECD078 !important; +} + +.button-border.button-yellow:hover, +.button-border.button-yellow.button-fill.button-light:hover { color: #333 !important; } + +.button-green:not(.button-border) { background-color: #59BA41 !important; } +.button-3d.button-green:hover, +.button-reveal.button-green:hover, +.button-border.button-green:hover, +.button-border.button-green.button-fill::before { background-color: #59BA41 !important; } + +.button-border.button-green { + color: #59BA41; + border-color: #59BA41; +} + +.button-brown:not(.button-border) { background-color: #774F38 !important; } +.button-3d.button-brown:hover, +.button-reveal.button-brown:hover, +.button-border.button-brown:hover, +.button-border.button-brown.button-fill::before { background-color: #774F38 !important; } + +.button-border.button-brown { + color: #774F38; + border-color: #774F38; +} + +.button-aqua:not(.button-border) { background-color: #40C0CB !important; } +.button-3d.button-aqua:hover, +.button-reveal.button-aqua:hover, +.button-border.button-aqua:hover, +.button-border.button-aqua.button-fill::before { background-color: #40C0CB !important; } + +.button-border.button-aqua { + color: #40C0CB; + border-color: #40C0CB; +} + +.button-light.button-lime:not(.button-border) { background-color: #AEE239 !important; } +.button-3d.button-lime:hover, +.button-reveal.button-lime:hover, +.button-border.button-lime:hover, +.button-border.button-lime.button-fill::before { background-color: #AEE239 !important; } + +.button-border.button-lime { + color: #AEE239; + border-color: #AEE239; +} + +.button-purple:not(.button-border) { background-color: #5D4157 !important; } +.button-3d.button-purple:hover, +.button-reveal.button-purple:hover, +.button-border.button-purple:hover, +.button-border.button-purple.button-fill::before { background-color: #5D4157 !important; } + +.button-border.button-purple { + color: #5D4157; + border-color: #5D4157; +} + +.button-leaf:not(.button-border) { background-color: #A8CABA !important; } +.button-3d.button-leaf:hover, +.button-reveal.button-leaf:hover, +.button-border.button-leaf:hover, +.button-border.button-leaf.button-fill::before { background-color: #A8CABA !important; } + +.button-border.button-leaf { + color: #A8CABA; + border-color: #A8CABA; +} + +.button-pink:not(.button-border) { background-color: #F89FA1 !important; } +.button-3d.button-pink:hover, +.button-reveal.button-pink:hover, +.button-border.button-pink:hover, +.button-border.button-pink.button-fill::before { background-color: #F89FA1 !important; } + +.button-border.button-pink { + color: #F89FA1; + border-color: #F89FA1; +} + +.button-dirtygreen:not(.button-border) { background-color: #1693A5 !important; } +.button-3d.button-dirtygreen:hover, +.button-reveal.button-dirtygreen:hover, +.button-border.button-dirtygreen:hover, +.button-border.button-dirtygreen.button-fill::before { background-color: #1693A5 !important; } + +.button-border.button-dirtygreen { + color: #1693A5; + border-color: #1693A5; +} + +.button-blue:not(.button-border) { background-color: #1265A8 !important; } +.button-3d.button-blue:hover, +.button-reveal.button-blue:hover, +.button-border.button-blue:hover, +.button-border.button-blue.button-fill::before { background-color: #1265A8 !important; } + +.button-border.button-blue { + color: #1265A8; + border-color: #1265A8; +} + +.button-amber:not(.button-border) { background-color: #EB9C4D !important; } +.button-3d.button-amber:hover, +.button-reveal.button-amber:hover, +.button-border.button-amber:hover, +.button-border.button-amber.button-fill::before { background-color: #EB9C4D !important; } + +.button-border.button-amber { + color: #EB9C4D; + border-color: #EB9C4D; +} + +.button-black:not(.button-border) { background-color: #111 !important; } +.button-3d.button-black:hover, +.button-reveal.button-black:hover, +.button-border.button-black:hover, +.button-border.button-black.button-fill::before { background-color: #111 !important; } + +.button-border.button-black { + color: #111; + border-color: #111; +} + +.button-white:not(.button-border) { background-color: #F9F9F9 !important; } +.button-3d.button-white:hover, +.button-reveal.button-white:hover { background-color: #F9F9F9 !important; } + + +/* Buttons - No Hover +-----------------------------------------------------------------*/ + +.button.button-nohover:hover { + opacity: inherit !important; + background-color: inherit !important; + color: inherit !important; + border-color: inherit !important; +} + + +/* ---------------------------------------------------------------- + Promo Boxes +-----------------------------------------------------------------*/ + + +.promo { + position: relative; +} + +.promo h3 { + font-weight: bold; + margin-bottom: 0; +} + +.promo h3 + span { + display: block; + color: #444; + font-weight: 300; + font-size: 1.125rem; + margin-top: 6px; +} + + +/* Promo Uppercase +-----------------------------------------------------------------*/ + +.promo-uppercase { text-transform: uppercase; } + +.promo-uppercase h3 { font-size: 1.25rem; } + +.promo-uppercase h3 + span { + font-size: 1rem; +} + + +/* Promo - with Border +-----------------------------------------------------------------*/ + +.promo-border { + border: 1px solid #E5E5E5; + border-radius: 3px; +} + + +/* Promo - Light +-----------------------------------------------------------------*/ + +.promo-light { + background-color: #F5F5F5; + border-radius: 3px; +} + + +/* Promo - Dark +-----------------------------------------------------------------*/ + +.promo-dark { + border: 0 !important; + background-color: #333; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); + border-radius: 3px; +} + +.promo-dark h3 { color: #FFF; } + +.promo-dark h3 + span { + color: #EEE; + font-weight: 400; +} + + +/* Promo - 100% Full Width +-----------------------------------------------------------------*/ + +.promo-full { + border-radius: 0 !important; + border-left: 0 !important; + border-right: 0 !important; +} + + +/* Promo - Parallax +-----------------------------------------------------------------*/ + +.promo.parallax { padding: 80px 0 !important; } + + +/* Promo - Mini +-----------------------------------------------------------------*/ + +.promo-mini { + text-align: left; +} + +.promo-mini h3 { + font-size: 1.25rem; +} + +.promo-mini.promo-uppercase h3 { font-size: 18px; } + + +/* ---------------------------------------------------------------- + Featured Boxes +-----------------------------------------------------------------*/ + + +.feature-box { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-left: -0.75rem; + margin-right: -0.75rem; +} + +.feature-box:first-child { margin-top: 0; } + +.fbox-icon { + width: 5.5rem; + height: 4rem; + padding: 0 0.75rem; +} + +.fbox-icon a, +.fbox-icon i, +.fbox-icon img { + display: block; + position: relative; + width: 100%; + height: 100%; + color: #FFF; +} + +.fbox-icon i, +.fbox-icon img { + border-radius: 50%; + background-color: #1ABC9C; +} + +.fbox-icon i { + font-style: normal; + font-size: 1.75rem; + line-height: 4rem; + text-align: center; +} + +.fbox-content { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + min-width: 0; + max-width: 100%; + padding: 0 0.75rem; +} + +.fbox-content h3 { + font-size: 1rem; + font-weight: 600; + font-family: 'Poppins', sans-serif; + text-transform: uppercase; + margin-bottom: 0; + color: #333; +} + +.fbox-content p { + margin-top: 0.5rem; + margin-bottom: 0px; + color: #999; +} + +.fbox-content .before-heading { + font-size: 0.875rem; +} + +.fbox-content-sm h3, +.fbox-content-sm p { + font-size: 0.875rem; +} + +.fbox-content-sm .before-heading { + font-size: 0.75rem; +} + +.fbox-content-lg h3 { + font-size: 1.25rem; +} + +.fbox-content-lg p { + font-size: 1.125rem; + margin-top: 0.75rem; +} + +.fbox-content-lg .before-heading { + font-size: 1rem; +} + + +/* Feature Box - Icon Small +-----------------------------------------------------------------*/ + +.fbox-sm { + margin-left: -0.5rem; + margin-right: -0.5rem; +} + +.fbox-sm .fbox-icon { + width: 3rem; + height: 2rem; + padding: 0 0.5rem; +} + +.fbox-sm .fbox-icon i { + font-size: 1rem; + line-height: 2rem; +} + +.fbox-sm .fbox-content { + padding: 0 0.5rem; +} + +/* Feature Box - Icon Large +-----------------------------------------------------------------*/ + +.fbox-lg .fbox-icon { + width: 7.5rem; + height: 6rem; +} + +.fbox-lg .fbox-icon i { + font-size: 2.5rem; + line-height: 6rem; +} + +/* Feature Box - Icon X-Large +-----------------------------------------------------------------*/ + +.fbox-xl .fbox-icon { + width: 9.5rem; + height: 8rem; +} + +.fbox-xl .fbox-icon i { + font-size: 4.5rem; + line-height: 8rem; +} + + +/* Feature Box - Icon Outline +-----------------------------------------------------------------*/ + +.fbox-outline .fbox-icon a { + border: 1px solid #1ABC9C; + padding: 0.25rem; + border-radius: 50%; +} + +.fbox-outline .fbox-icon i { + line-height: 3.5rem; +} + + +/* Feature Box - Icon Outline Sizes +-----------------------------------------------------------------*/ + +.fbox-outline.fbox-sm .fbox-icon i { line-height: 1.5rem; } + +.fbox-outline.fbox-lg .fbox-icon i { line-height: 5.5rem; } + +.fbox-outline.fbox-xl .fbox-icon i { line-height: 7.5rem; } + + +/* Feature Box - Icon Rounded +-----------------------------------------------------------------*/ + +.fbox-rounded .fbox-icon { border-radius: 3px !important; } + +.fbox-rounded .fbox-icon i, +.fbox-rounded .fbox-icon img { border-radius: 3px !important; } + + +/* Feature Box - Icon Rounded Sizes +-----------------------------------------------------------------*/ + +.fbox-rounded.fbox-lg .fbox-icon { border-radius: 4px !important; } + +.fbox-rounded.fbox-lg .fbox-icon i, +.fbox-rounded.fbox-lg .fbox-icon img { border-radius: 4px !important; } + +.fbox-rounded.fbox-xl .fbox-icon { border-radius: 6px !important; } + +.fbox-rounded.fbox-xl .fbox-icon i, +.fbox-rounded.fbox-xl .fbox-icon img { border-radius: 6px !important; } + + +/* Feature Box - Light Background +-----------------------------------------------------------------*/ + +.fbox-light.fbox-outline .fbox-icon a { border-color: #E5E5E5; } + +.fbox-light .fbox-icon i, +.fbox-light .fbox-icon img { + border: 1px solid #E5E5E5; + background-color: #F5F5F5; + color: #e31e24; +} + + +/* Feature Box - Dark Background +-----------------------------------------------------------------*/ + +.fbox-dark.fbox-outline .fbox-icon a { border-color: #444; } + +.fbox-dark .fbox-icon i, +.fbox-dark .fbox-icon img { background-color: #333; } + + +/* Feature Box - Border +-----------------------------------------------------------------*/ + +.fbox-border .fbox-icon a { + border: 1px solid #1ABC9C; + border-radius: 50%; +} + +.fbox-border .fbox-icon i, +.fbox-border .fbox-icon img { + border: none; + background-color: transparent !important; + color: #1ABC9C; +} + + +/* Feature Box - Border - Light +-----------------------------------------------------------------*/ + +.fbox-border.fbox-light .fbox-icon a { border-color: #E5E5E5; } + +.fbox-border.fbox-light .fbox-icon i, +.fbox-border.fbox-light .fbox-icon img { color: #888; } + + +/* Feature Box - Border - Dark +-----------------------------------------------------------------*/ + +.fbox-border.fbox-dark .fbox-icon a { border-color: #333; } + +.fbox-border.fbox-dark .fbox-icon i, +.fbox-border.fbox-dark .fbox-icon img { color: #444; } + + +/* Feature Box - Plain +-----------------------------------------------------------------*/ + +.fbox-plain .fbox-icon { + border: none !important; +} + +.fbox-plain .fbox-icon i, +.fbox-plain .fbox-icon img { + border: none; + background-color: transparent !important; + color: #1ABC9C; + border-radius: 0; +} + +.fbox-plain .fbox-icon i { + font-size: 3rem; + line-height: 1; +} + +.fbox-plain.fbox-image .fbox-icon { width: auto; } + +.fbox-plain.fbox-image .fbox-icon img { + width: auto; + display: inline-block; +} + +.fbox-plain.fbox-light .fbox-icon i, +.fbox-plain.fbox-light .fbox-icon img { color: #888; } + +.fbox-plain.fbox-dark .fbox-icon i, +.fbox-plain.fbox-dark .fbox-icon img { color: #444; } + + +/* Feature Box - Icon Plain Sizes +-----------------------------------------------------------------*/ + +.fbox-plain.fbox-sm .fbox-icon i { font-size: 2rem; } + +.fbox-plain.fbox-lg .fbox-icon i { font-size: 4.5rem; } + +.fbox-plain.fbox-xl .fbox-icon i { font-size: 6rem; } + + +/* Feature Box - Center & Large Icons +-----------------------------------------------------------------*/ + +.fbox-center { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: center; + align-items: center; + text-align: center; +} + +.fbox-center .fbox-icon { + margin-bottom: 1.5rem; +} + +.fbox-center .fbox-content { + -ms-flex-preferred-size: auto; +} + + +/* Feature Box - Subtitle +-----------------------------------------------------------------*/ + +.fbox-content + .fbox-icon { + margin-top: 1.5rem; + margin-bottom: 0 !important; +} + +.fbox-content h3 span.subtitle { + display: block; + margin-top: 5px; + color: #444; + font-weight: 300; + text-transform: none; +} + +.fbox-center.fbox-sep:not(.fbox-bg) h3::after { + content: ''; + display: block; + margin: 1.25rem auto; + width: 2rem; + height: 2px; + background-color: #555; + -webkit-transition: width .3s ease; + -o-transition: width .3s ease; + transition: width .3s ease; +} + +.fbox-center.fbox-sep:not(.fbox-bg):hover h3::after { width: 3rem; } + +.fbox-center.fbox-italic p { + font-style: italic; + font-family: 'Lato', sans-serif; +} + + +/* Feature Box - Background +-----------------------------------------------------------------*/ + +.fbox-bg.fbox-center { + margin-top: 2rem; + margin-left: 0; + margin-right: 0; + padding: 0 2rem 2rem; + border: 1px solid #E5E5E5; + border-radius: 5px; +} + +.fbox-bg.fbox-center .fbox-icon { + margin-top: -2rem; +} + +.fbox-bg.fbox-center .fbox-icon { background-color: #FFF; } + + +.fbox-bg.fbox-center.fbox-lg { + margin-top: 3rem; +} + +.fbox-bg.fbox-center.fbox-lg .fbox-icon { + margin-top: -3rem; +} + +.fbox-bg.fbox-center.fbox-xl { + margin-top: 4rem; +} + +.fbox-bg.fbox-center.fbox-xl .fbox-icon { + margin-top: -4rem; +} + + +/* Animated Icon Hovers +-----------------------------------------------------------------*/ + +.fbox-effect .fbox-icon i { z-index: 1; } + +.fbox-effect .fbox-icon i::after { + pointer-events: none; + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + content: ''; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.fbox-rounded.fbox-effect .fbox-icon i::after { border-radius: 3px; } + +.fbox-effect .fbox-icon i { + -webkit-transition: background-color 0.3s, color 0.3s; + -o-transition: background-color 0.3s, color 0.3s; + transition: background-color 0.3s, color 0.3s; +} + +.fbox-effect .fbox-icon i::after { + top: -3px; + left: -3px; + padding: 3px; + box-shadow: 0 0 0 2px #333; + -webkit-transition: -webkit-transform 0.3s, opacity 0.3s; + -webkit-transform: scale(.8); + -moz-transition: -moz-transform 0.3s, opacity 0.3s; + -moz-transform: scale(.8); + -ms-transform: scale(.8); + transition: transform 0.3s, opacity 0.3s; + transform: scale(.8); + opacity: 0; +} + +.fbox-effect .fbox-icon i:hover, +.fbox-effect:hover .fbox-icon i { + background-color: #333; + color: #FFF; +} + +.fbox-effect.fbox-dark .fbox-icon i::after { box-shadow: 0 0 0 2px #1ABC9C; } + +.fbox-effect.fbox-dark .fbox-icon i:hover, +.fbox-effect.fbox-dark:hover .fbox-icon i { background-color: #1ABC9C; } + +.fbox-effect .fbox-icon i:hover::after, +.fbox-effect:hover .fbox-icon i::after { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; +} + +/* Icon Effects - Bordered +-----------------------------------------------------------------*/ + +.fbox-border.fbox-effect .fbox-icon i { + -webkit-transition: color 0.5s, box-shadow 0.5s, background-color 0.5s; + -o-transition: color 0.5s, box-shadow 0.5s, background-color 0.5s; + transition: color 0.5s, box-shadow 0.5s, background-color 0.5s; +} + +.fbox-border.fbox-effect .fbox-icon i::after { + top: -2px; + left: -2px; + padding: 2px; + z-index: -1; + box-shadow: none; + background-image: url('images/icons/iconalt.svg'); + background-position: center center; + background-size: 100% 100%; + -webkit-transition: -webkit-transform 0.5s, opacity 0.5s, background-color 0.5s; + -o-transition: -moz-transform 0.5s, opacity 0.5s, background-color 0.5s; + transition: transform 0.5s, opacity 0.5s, background-color 0.5s; +} + +.fbox-border.fbox-rounded.fbox-effect .fbox-icon i::after { border-radius: 3px; } + +.fbox-border.fbox-effect .fbox-icon i:hover, +.fbox-border.fbox-effect:hover .fbox-icon i { + color: #FFF; + box-shadow: 0 0 0 1px #333; +} + +.fbox-border.fbox-effect .fbox-icon i::after { + -webkit-transform: scale(1.3); + -moz-transform: scale(1.3); + -ms-transform: scale(1.3); + transform: scale(1.3); + opacity: 0; + background-color: #333; +} + +.fbox-border.fbox-effect.fbox-dark .fbox-icon i:hover, +.fbox-border.fbox-effect.fbox-dark:hover .fbox-icon i { box-shadow: 0 0 0 1px #1ABC9C; } + +.fbox-border.fbox-effect.fbox-dark .fbox-icon i::after { background-color: #1ABC9C; } + +.fbox-border.fbox-effect .fbox-icon i:hover::after, +.fbox-border.fbox-effect:hover .fbox-icon i::after { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + opacity: 1; +} + + +/* Media Featured Box +-----------------------------------------------------------------*/ + +.media-box { + padding: 0; + margin-left: 0; + margin-right: 0; + -ms-flex-direction: column; + flex-direction: column; +} + +.media-box .fbox-media { margin: 0 0 1.5rem; } + +.media-box .fbox-media, +.media-box .fbox-media a, +.media-box .fbox-media img { + position: relative; + display: block; + width: 100%; + height: auto; +} + +.media-box .fbox-media iframe { display: block; } + +.media-box p { margin-top: 1rem; } + +.media-box .fbox-content { + -ms-flex-preferred-size: auto; +} + +.media-box.fbox-bg .fbox-media { margin: 0; } + +.media-box.fbox-bg .fbox-content { + padding: 1.5rem; + background-color: #FFF; + border: 1px solid #E5E5E5; + border-top: 0; + border-radius: 0 0 5px 5px; +} + +.media-box.fbox-bg .fbox-media img { border-radius: 5px 5px 0 0; } + + +/* ---------------------------------------------------------------- + Flipbox +-----------------------------------------------------------------*/ + +.flipbox { perspective: 1000px; } + +.flipbox-inner { + transition: 0.5s; + transition-timing-function: ease; + position: relative; + transform-style: preserve-3d; +} + +.flipbox-front, +.flipbox-back { + -webkit-backface-visibility: hidden; +} + +.flipbox-front { z-index: 2; } + +.flipbox-back { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; +} + +.flipbox:not(.flipbox-vertical) .flipbox-front { transform: rotateY(0deg); } +.flipbox:not(.flipbox-vertical) .flipbox-back { transform: rotateY(-180deg); } + +.flipbox.flipbox-vertical .flipbox-front { transform: rotateX(0deg); } +.flipbox.flipbox-vertical .flipbox-back { transform: rotateX(-180deg); } + +.flipbox:not(.flipbox-vertical):hover .flipbox-inner, +.flipbox:not(.flipbox-vertical).hover .flipbox-inner { transform: rotateY(180deg); } + +.flipbox.flipbox-vertical:hover .flipbox-inner, +.flipbox.flipbox-vertical.hover .flipbox-inner { transform: rotateX(180deg); } + + +/* ---------------------------------------------------------------- + Process Steps +-----------------------------------------------------------------*/ + +.process-steps { + margin: 0 0 40px; + list-style: none; +} + +.process-steps li { + position: relative; + text-align: center; + overflow: hidden; +} + +.process-steps li .i-circled { margin-bottom: 0 !important; } + +.process-steps li .i-bordered { background-color: #FFF; } + +.process-steps li h5 { + margin: 15px 0 0 0; + font-size: 1rem; + font-weight: 300; +} + +.process-steps li.active h5, +.process-steps li.ui-tabs-active h5 { + font-weight: 600; + color: #1ABC9C; +} + +.process-steps li.active a, +.process-steps li.ui-tabs-active a { + background-color: #1ABC9C !important; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); + border-color: #1ABC9C !important; +} + +@media (min-width: 992px) { + + .process-steps li::before, + .process-steps li::after { + content: ''; + position: absolute; + top: 30px; + left: 0; + margin-left: -26px; + width: 50%; + border-top: 1px dashed #DDD; + } + + .process-steps li::after { + left: auto; + right: 0; + margin: 0 -26px 0 0; + } + + .process-steps li:first-child::before, + .process-steps li:last-child::after { display: none; } + +} + + +/* ---------------------------------------------------------------- + Alerts +-----------------------------------------------------------------*/ + + +.style-msg, +.style-msg2 { + position: relative; + display: block; + color: #444; + border-left: 4px solid rgba(0,0,0,0.1); + margin-bottom: 20px; +} + +.style-msg2 { border-left: 4px solid rgba(0,0,0,0.2); } + +.successmsg { + background: #d4edda; + color: #155724; +} + +.errormsg { + background: #f8d7da; + color: #721c24; +} + +.infomsg { + background: #d1ecf1; + color: #0c5460; +} + +.alertmsg { + background: #fff3cd; + color: #856404; +} + +.style-msg .sb-msg, +.style-msg2 .msgtitle, +.style-msg2 .sb-msg { + display: block; + padding: 15px; + border-left: 1px solid rgba(255,255,255,0.5); + font-size: 1rem; +} + +.style-msg2 .msgtitle { + background: rgba(0,0,0,0.15); + border-top: none; + border-bottom: none; + font-weight: bold; +} + +.style-msg-light .sb-msg, +.style-msg-light .msgtitle { + color: #FFF; +} + +.style-msg2 .sb-msg { font-weight: normal; } + +.style-msg2 ol, +.style-msg2 ul { margin: 0 0 0 30px; } + +.style-msg2 ol { list-style-type: decimal; } + +.style-msg2 ul { list-style-type: disc; } + +.alert i, +.sb-msg i, +.msgtitle i { + position: relative; + top: 1px; + font-size: 0.875rem; + width: 14px; + text-align: center; + margin-right: 5px; +} + +.style-msg .btn-close { + position: absolute; + top: 0px; + left: auto; + right: 0px; +} + + +/* ---------------------------------------------------------------- + Styled Icons +-----------------------------------------------------------------*/ + + +.i-rounded, +.i-plain, +.i-circled, +.i-bordered, +.social-icon { + display: block; + float: left; + margin: 4px 11px 7px 0; + text-align: center !important; + font-size: 28px; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0,0,0,0.3); + cursor: pointer; + font-style: normal; +} + +body:not(.device-touch) .i-rounded, +body:not(.device-touch) .i-plain, +body:not(.device-touch) .i-circled, +body:not(.device-touch) .i-bordered, +body:not(.device-touch) .social-icon { + -webkit-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease; +} + +.i-rounded, +.i-circled, +.i-bordered { + width: 52px !important; + height: 52px !important; + line-height: 52px !important; + background-color: #444; + border-radius: 3px; +} + +.i-bordered { + border: 1px solid #555; + line-height: 50px !important; + background-color: transparent !important; + color: #444; + text-shadow: none; +} + +.i-plain { + width: 36px !important; + height: 36px !important; + font-size: 28px; + line-height: 36px !important; + color: #444; + text-shadow: 1px 1px 1px #FFF; +} + +.i-plain:hover { color: #777; } + +.i-circled { border-radius: 50%; } + +.i-light { + background-color: #F5F5F5; + color: #444; + text-shadow: 1px 1px 1px #FFF; + box-shadow: inset 0 0 15px rgba(0,0,0,0.2); +} + +.i-alt { + background-image: url('images/icons/iconalt.svg'); + background-position: center center; + background-size: 100% 100%; +} + + +.i-rounded:hover, +.i-circled:hover { + background-color: #1ABC9C; + color: #FFF; + text-shadow: 1px 1px 1px rgba(0,0,0,0.3); + box-shadow: 0 0 0 rgba(0,0,0,0.2); +} + +.i-bordered:hover { + background-color: #444 !important; + color: #FFF; + border-color: #444; +} + + +/* Icon Size - Small +-----------------------------------------------------------------*/ + +.i-small.i-rounded, +.i-small.i-plain, +.i-small.i-circled, +.i-small.i-bordered { + margin: 4px 11px 7px 0; + font-size: 0.875rem; +} + +.i-small.i-rounded, +.i-small.i-circled, +.i-small.i-bordered { + width: 28px !important; + height: 28px !important; + line-height: 28px !important; +} + +.i-small.i-bordered { line-height: 26px !important; } + +.i-small.i-plain { + width: 18px !important; + height: 18px !important; + font-size: 0.875rem; + line-height: 18px !important; +} + + +/* Icon Size - Small +-----------------------------------------------------------------*/ + +.i-medium.i-rounded, +.i-medium.i-plain, +.i-medium.i-circled, +.i-medium.i-bordered { + margin: 6px 13px 9px 0; + font-size: 21px; +} + +.i-medium.i-rounded, +.i-medium.i-circled, +.i-medium.i-bordered { + width: 36px !important; + height: 36px !important; + line-height: 36px !important; +} + +.i-medium.i-bordered { line-height: 34px !important; } + +.i-medium.i-plain { + width: 28px !important; + height: 28px !important; + font-size: 1.25rem; + line-height: 28px !important; +} + + +/* Icon Size - Large +-----------------------------------------------------------------*/ + +.i-large.i-rounded, +.i-large.i-plain, +.i-large.i-circled, +.i-large.i-bordered { + margin: 4px 11px 7px 0; + font-size: 42px; +} + +.i-large.i-rounded, +.i-large.i-circled, +.i-large.i-bordered { + width: 64px !important; + height: 64px !important; + line-height: 64px !important; +} + +.i-large.i-bordered { line-height: 62px !important; } + +.i-large.i-plain { + width: 48px !important; + height: 48px !important; + font-size: 42px; + line-height: 48px !important; +} + + +/* Icon Size - Extra Large +-----------------------------------------------------------------*/ + +.i-xlarge.i-rounded, +.i-xlarge.i-plain, +.i-xlarge.i-circled, +.i-xlarge.i-bordered { + margin: 4px 11px 7px 0; + font-size: 56px; +} + +.i-xlarge.i-rounded, +.i-xlarge.i-circled, +.i-xlarge.i-bordered { + width: 84px !important; + height: 84px !important; + line-height: 84px !important; +} + +.i-xlarge.i-bordered { line-height: 82px !important; } + +.i-xlarge.i-plain { + width: 64px !important; + height: 64px !important; + font-size: 56px; + line-height: 64px !important; +} + + +/* Icon Size - Extra Extra Large +-----------------------------------------------------------------*/ + +.i-xxlarge.i-rounded, +.i-xxlarge.i-plain, +.i-xxlarge.i-circled, +.i-xxlarge.i-bordered { + margin: 6px 15px 10px 0; + font-size: 64px; +} + +.i-xxlarge.i-rounded, +.i-xxlarge.i-circled, +.i-xxlarge.i-bordered { + width: 96px !important; + height: 96px !important; + line-height: 96px !important; +} + +.i-xxlarge.i-bordered { line-height: 94px !important; } + +.i-xxlarge.i-plain { + width: 80px !important; + height: 80px !important; + font-size: 64px; + line-height: 80px !important; +} + + +/* ---------------------------------------------------------------- + Social Icons +-----------------------------------------------------------------*/ + + +.social-icon { + margin: 0 5px 5px 0; + width: 40px; + height: 40px; + font-size: 1.25rem; + line-height: 38px !important; + color: #555; + text-shadow: none; + border: 1px solid #AAA; + border-radius: 3px; + overflow: hidden; +} + +.d-flex > .social-icon, +.d-sm-flex > .social-icon, +.d-md-flex > .social-icon, +.d-lg-flex > .social-icon, +.d-xl-flex > .social-icon, +.d-xxl-flex > .social-icon { + float: none; + margin-bottom: 0px; +} + + +/* Social Icons - Rounded +-----------------------------------------------------------------*/ + +.si-rounded { border-radius: 50%; } + +/* Social Icons - Borderless +-----------------------------------------------------------------*/ + +.si-borderless { border-color: transparent !important; } + +/* Social Icons - Dark +-----------------------------------------------------------------*/ + +.si-dark { + background-color: #444; + color: #FFF !important; + border-color: transparent; +} + +/* Social Icons - Light +-----------------------------------------------------------------*/ + +.si-light { + background-color: rgba(0,0,0,0.05); + color: #666 !important; + border-color: transparent; +} + +/* Social Icons - Colored +-----------------------------------------------------------------*/ + +.si-colored { border-color: transparent !important; } + +.si-colored i { color: #FFF; } + +/* Social Icons - Large +-----------------------------------------------------------------*/ + +.social-icon.si-large { + margin: 0 10px 10px 0; + width: 56px; + height: 56px; + font-size: 30px; + line-height: 54px !important; +} + +/* Social Icons - Small +-----------------------------------------------------------------*/ + +.social-icon.si-small { + width: 32px; + height: 32px; + font-size: 0.875rem; + line-height: 30px !important; +} + +.social-icon i { + display: block; + position: relative; +} + +body:not(.device-touch) .social-icon i { + -webkit-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease; +} + +.social-icon i:last-child { color: #FFF !important; } + +.social-icon:hover i:first-child { margin-top: -38px; } + +.social-icon.si-large:hover i:first-child { margin-top: -54px; } + +.social-icon.si-small:hover i:first-child { margin-top: -30px; } + +.social-icon:hover { + color: #555; + border-color: transparent; +} + +.si-colored.social-icon { border-color: transparent; } + +/* Social Icons - Sticky +-----------------------------------------------------------------*/ + +.si-sticky { + position: fixed; + top: 50%; + left: 5px; + width: 36px; + z-index: 499; + transform: translateY(-50%); +} + +/* Social Icons - Sticky Right +-----------------------------------------------------------------*/ + +.si-sticky.si-sticky-right { + left: auto; + right: 8px; +} + +/* Social Icons - Share +-----------------------------------------------------------------*/ + +.si-share { + position: relative; + padding-left: 5px; + border-top: 1px solid #EEE; + border-bottom: 1px solid #EEE; +} + +.si-share span { + line-height: 36px; + font-weight: bold; + font-size: 13px; +} + +.si-share .social-icon { + margin: -1px 0; + border-radius: 0; + font-size: 15px; +} + +.si-facebook:hover, +.si-colored.si-facebook { background-color: #3B5998 !important; } +.si-delicious:hover, +.si-colored.si-delicious { background-color: #205CC0 !important; } +.si-paypal:hover, +.si-colored.si-paypal { background-color: #00588B !important; } +.si-flattr:hover, +.si-colored.si-flattr { background-color: #F67C1A !important; } +.si-android:hover, +.si-colored.si-android { background-color: #A4C639 !important; } +.si-smashmag:hover, +.si-colored.si-smashmag { background-color: #E53B2C !important; } +.si-gplus:hover, +.si-colored.si-gplus { background-color: #DD4B39 !important; } +.si-wikipedia:hover, +.si-colored.si-wikipedia { background-color: #333 !important; } +.si-stumbleupon:hover, +.si-colored.si-stumbleupon { background-color: #F74425 !important; } +.si-foursquare:hover, +.si-colored.si-foursquare { background-color: #25A0CA !important; } +.si-call:hover, +.si-colored.si-call { background-color: #444 !important; } +.si-ninetyninedesigns:hover, +.si-colored.si-ninetyninedesigns { background-color: #F26739 !important; } +.si-forrst:hover, +.si-colored.si-forrst { background-color: #5B9A68 !important; } +.si-digg:hover, +.si-colored.si-digg { background-color: #191919 !important; } +.si-spotify:hover, +.si-colored.si-spotify { background-color: #81B71A !important; } +.si-reddit:hover, +.si-colored.si-reddit { background-color: #C6C6C6 !important; } +.si-blogger:hover, +.si-colored.si-blogger { background-color: #FC4F08 !important; } +.si-cc:hover, +.si-colored.si-cc { background-color: #688527 !important; } +.si-dribbble:hover, +.si-colored.si-dribbble { background-color: #EA4C89 !important; } +.si-evernote:hover, +.si-colored.si-evernote { background-color: #5BA525 !important; } +.si-flickr:hover, +.si-colored.si-flickr { background-color: #FF0084 !important; } +.si-google:hover, +.si-colored.si-google { background-color: #DD4B39 !important; } +.si-instapaper:hover, +.si-colored.si-instapaper { background-color: #333 !important; } +.si-klout:hover, +.si-colored.si-klout { background-color: #FF5F52 !important; } +.si-linkedin:hover, +.si-colored.si-linkedin { background-color: #0E76A8 !important; } +.si-vk:hover, +.si-colored.si-vk { background-color: #2B587A !important; } +.si-rss:hover, +.si-colored.si-rss { background-color: #EE802F !important; } +.si-skype:hover, +.si-colored.si-skype { background-color: #00AFF0 !important; } +.si-twitter:hover, +.si-colored.si-twitter { background-color: #00ACEE !important; } +.si-youtube:hover, +.si-colored.si-youtube { background-color: #C4302B !important; } +.si-vimeo:hover, +.si-colored.si-vimeo { background-color: #86C9EF !important; } +.si-aim:hover, +.si-colored.si-aim { background-color: #FCD20B !important; } +.si-yahoo:hover, +.si-colored.si-yahoo { background-color: #720E9E !important; } +.si-email3:hover, +.si-colored.si-email3 { background-color: #6567A5 !important; } +.si-macstore:hover, +.si-colored.si-macstore { background-color: #333333 !important; } +.si-myspace:hover, +.si-colored.si-myspace { background-color: #666666 !important; } +.si-podcast:hover, +.si-colored.si-podcast { background-color: #E4B21B !important; } +.si-cloudapp:hover, +.si-colored.si-cloudapp { background-color: #525557 !important; } +.si-dropbox:hover, +.si-colored.si-dropbox { background-color: #3D9AE8 !important; } +.si-ebay:hover, +.si-colored.si-ebay { background-color: #89C507 !important; } +.si-github:hover, +.si-colored.si-github { background-color: #171515 !important; } +.si-googleplay:hover, +.si-colored.si-googleplay { background-color: #DD4B39 !important; } +.si-itunes:hover, +.si-colored.si-itunes { background-color: #222 !important; } +.si-plurk:hover, +.si-colored.si-plurk { background-color: #CF5A00 !important; } +.si-pinboard:hover, +.si-colored.si-pinboard { background-color: #0000E6 !important; } +.si-soundcloud:hover, +.si-colored.si-soundcloud { background-color: #FF7700 !important; } +.si-tumblr:hover, +.si-colored.si-tumblr { background-color: #34526F !important; } +.si-wordpress:hover, +.si-colored.si-wordpress { background-color: #1E8CBE !important; } +.si-yelp:hover, +.si-colored.si-yelp { background-color: #C41200 !important; } +.si-intensedebate:hover, +.si-colored.si-intensedebate { background-color: #009EE4 !important; } +.si-eventbrite:hover, +.si-colored.si-eventbrite { background-color: #F16924 !important; } +.si-scribd:hover, +.si-colored.si-scribd { background-color: #666666 !important; } +.si-stripe:hover, +.si-colored.si-stripe { background-color: #008CDD !important; } +.si-print:hover, +.si-colored.si-print { background-color: #111 !important; } +.si-dwolla:hover, +.si-colored.si-dwolla { background-color: #FF5C03 !important; } +.si-statusnet:hover, +.si-colored.si-statusnet { background-color: #131A30 !important; } +.si-acrobat:hover, +.si-colored.si-acrobat { background-color: #D3222A !important; } +.si-drupal:hover, +.si-colored.si-drupal { background-color: #27537A !important; } +.si-buffer:hover, +.si-colored.si-buffer { background-color: #333333 !important; } +.si-pocket:hover, +.si-colored.si-pocket { background-color: #EE4056 !important; } +.si-bitbucket:hover, +.si-colored.si-bitbucket { background-color: #0E4984 !important; } +.si-stackoverflow:hover, +.si-colored.si-stackoverflow { background-color: #EF8236 !important; } +.si-hackernews:hover, +.si-colored.si-hackernews { background-color: #FF6600 !important; } +.si-xing:hover, +.si-colored.si-xing { background-color: #126567 !important; } +.si-instagram:hover, +.si-colored.si-instagram { background-color: #8A3AB9 !important; } +.si-quora:hover, +.si-colored.si-quora { background-color: #A82400 !important; } +.si-openid:hover, +.si-colored.si-openid { background-color: #E16309 !important; } +.si-steam:hover, +.si-colored.si-steam { background-color: #111 !important; } +.si-amazon:hover, +.si-colored.si-amazon { background-color: #E47911 !important; } +.si-disqus:hover, +.si-colored.si-disqus { background-color: #E4E7EE !important; } +.si-plancast:hover, +.si-colored.si-plancast { background-color: #222 !important; } +.si-appstore:hover, +.si-colored.si-appstore { background-color: #000 !important; } +.si-pinterest:hover, +.si-colored.si-pinterest { background-color: #C8232C !important; } +.si-fivehundredpx:hover, +.si-colored.si-fivehundredpx { background-color: #111 !important; } +.si-tiktok:hover, +.si-colored.si-tiktok { background-color: #000 !important; } +.si-whatsapp:hover, +.si-colored.si-whatsapp { background-color: #25D366 !important; } +.si-tripadvisor:hover, +.si-colored.si-tripadvisor { background-color: #00AF87 !important; } +.si-gpay:hover, +.si-colored.si-gpay { background-color: #6877DF !important; } +.si-unsplash:hover, +.si-colored.si-unsplash { background-color: #111 !important; } +.si-snapchat:hover, +.si-colored.si-snapchat { background-color: #FFFC00 !important; } + + +/* Social Icons Text Color +-----------------------------------------------------------------*/ + +.si-text-color.si-facebook i { color: #3B5998; } +.si-text-color.si-delicious i { color: #205CC0; } +.si-text-color.si-paypal i { color: #00588B; } +.si-text-color.si-flattr i { color: #F67C1A; } +.si-text-color.si-android i { color: #A4C639; } +.si-text-color.si-smashmag i { color: #E53B2C; } +.si-text-color.si-gplus i { color: #DD4B39; } +.si-text-color.si-wikipedia i { color: #333; } +.si-text-color.si-stumbleupon i { color: #F74425; } +.si-text-color.si-foursquare i { color: #25A0CA; } +.si-text-color.si-call i { color: #444; } +.si-text-color.si-ninetyninedesigns i { color: #F26739; } +.si-text-color.si-forrst i { color: #5B9A68; } +.si-text-color.si-digg i { color: #191919; } +.si-text-color.si-spotify i { color: #81B71A; } +.si-text-color.si-reddit i { color: #C6C6C6; } +.si-text-color.si-blogger i { color: #FC4F08; } +.si-text-color.si-cc i { color: #688527; } +.si-text-color.si-dribbble i { color: #EA4C89; } +.si-text-color.si-evernote i { color: #5BA525; } +.si-text-color.si-flickr i { color: #FF0084; } +.si-text-color.si-google i { color: #DD4B39; } +.si-text-color.si-instapaper i { color: #333; } +.si-text-color.si-klout i { color: #FF5F52; } +.si-text-color.si-linkedin i { color: #0E76A8; } +.si-text-color.si-vk i { color: #2B587A; } +.si-text-color.si-rss i { color: #EE802F; } +.si-text-color.si-skype i { color: #00AFF0; } +.si-text-color.si-twitter i { color: #00ACEE; } +.si-text-color.si-youtube i { color: #C4302B; } +.si-text-color.si-vimeo i { color: #86C9EF; } +.si-text-color.si-aim i { color: #FCD20B; } +.si-text-color.si-yahoo i { color: #720E9E; } +.si-text-color.si-email3 i { color: #6567A5; } +.si-text-color.si-macstore i { color: #333333; } +.si-text-color.si-myspace i { color: #666666; } +.si-text-color.si-podcast i { color: #E4B21B; } +.si-text-color.si-cloudapp i { color: #525557; } +.si-text-color.si-dropbox i { color: #3D9AE8; } +.si-text-color.si-ebay i { color: #89C507; } +.si-text-color.si-github i { color: #171515; } +.si-text-color.si-googleplay i { color: #DD4B39; } +.si-text-color.si-itunes i { color: #222; } +.si-text-color.si-plurk i { color: #CF5A00; } +.si-text-color.si-pinboard i { color: #0000E6; } +.si-text-color.si-soundcloud i { color: #FF7700; } +.si-text-color.si-tumblr i { color: #34526F; } +.si-text-color.si-wordpress i { color: #1E8CBE; } +.si-text-color.si-yelp i { color: #C41200; } +.si-text-color.si-intensedebate i { color: #009EE4; } +.si-text-color.si-eventbrite i { color: #F16924; } +.si-text-color.si-scribd i { color: #666666; } +.si-text-color.si-stripe i { color: #008CDD; } +.si-text-color.si-print i { color: #111; } +.si-text-color.si-dwolla i { color: #FF5C03; } +.si-text-color.si-statusnet i { color: #131A30; } +.si-text-color.si-acrobat i { color: #D3222A; } +.si-text-color.si-drupal i { color: #27537A; } +.si-text-color.si-buffer i { color: #333333; } +.si-text-color.si-pocket i { color: #EE4056; } +.si-text-color.si-bitbucket i { color: #0E4984; } +.si-text-color.si-stackoverflow i { color: #EF8236; } +.si-text-color.si-hackernews i { color: #FF6600; } +.si-text-color.si-xing i { color: #126567; } +.si-text-color.si-instagram i { color: #8A3AB9; } +.si-text-color.si-quora i { color: #A82400; } +.si-text-color.si-openid i { color: #E16309; } +.si-text-color.si-steam i { color: #111; } +.si-text-color.si-amazon i { color: #E47911; } +.si-text-color.si-disqus i { color: #E4E7EE; } +.si-text-color.si-plancast i { color: #222; } +.si-text-color.si-appstore i { color: #000; } +.si-text-color.si-pinterest i { color: #C8232C; } +.si-text-color.si-fivehundredpx i { color: #111; } +.si-text-color.si-tiktok i { color: #000; } +.si-text-color.si-whatsapp i { color: #25D366; } +.si-text-color.si-tripadvisor i { color: #00AF87; } +.si-text-color.si-gpay i { color: #6877DF; } +.si-text-color.si-unsplash i { color: #111; } +.si-text-color.si-snapchat i { color: #FFFC00; } + +.si-text-color:hover { color: #FFF; } + + +/* ---------------------------------------------------------------- + Toggle +-----------------------------------------------------------------*/ + + +.toggle { + display: block; + position: relative; + margin: 0 0 20px 0; +} + +.toggle-header, +.accordion-header { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0 -5px; + cursor: pointer; + color: #444; + font-size: 1rem; + font-weight: 700; +} + +.toggle-icon, +.accordion-icon { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + padding: 0 5px; + text-align: center; +} + +.toggle-icon i, +.toggle-icon span { + width: 1rem; +} + +.toggle-title, +.accordion-title { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + padding: 0 5px; +} + +.toggle:not(.toggle-active) > .toggle-header .toggle-open, +.toggle-active > .toggle-header .toggle-closed { + display: none; +} + +.toggle-active > .toggle-header .toggle-open { + display: inline-block; +} + +.toggle-content, +.accordion-content { + display: none; + position: relative; + padding: 0.75rem 0; +} + + + + +/* Toggle - with Title Background +-----------------------------------------------------------------*/ + +.toggle-bg .toggle-header { + background-color: #EEE; + margin: 0; + padding: 0.75rem; + border-radius: 2px; +} + +.toggle-bg .toggle-content { + padding: 1rem 0.75rem; +} + + +/* Toggle - Bordered +-----------------------------------------------------------------*/ + +.toggle-border { + border: 1px solid #CCC; + border-radius: 4px; +} + +.toggle-border .toggle-header { + padding: 0.75rem; + margin: 0; +} + +.toggle-border .toggle-content { + padding: 1rem; + padding-top: 0; +} + + +/* Toggle - FAQs +-----------------------------------------------------------------*/ + +.faqs .toggle { + border-bottom: 1px solid #EEE; + padding-bottom: 12px; + margin-bottom: 12px; +} + +.faqs .toggle-content { padding-bottom: 10px; } + + +/* ---------------------------------------------------------------- + Accordions +-----------------------------------------------------------------*/ + +.accordion { margin-bottom: 20px; } + +.accordion-header { + padding: 0.75rem 0; + border-top: 1px dotted #DDD; + cursor: pointer; +} + +.accordion:not([data-collapsible="true"]) .accordion-header.accordion-active { cursor: auto; } + +.accordion-header:first-child { border-top: none; } + +.accordion-header:not(.accordion-active) .accordion-open, +.accordion-active .accordion-closed { display: none; } + +.accordion-active .accordion-open { display: inline-block; } + +.accordion-content { + padding-top: 0; + padding-bottom: 1.5rem; +} + + +/* Accordion - with Title Background +-----------------------------------------------------------------*/ + +.accordion-bg .accordion-header { + background-color: #EEE; + padding: 0.75rem; + border-radius: 2px; + margin: 0; + margin-bottom: 5px; + border-top: 0; +} + +.accordion-bg .accordion-content { + padding: 0.75rem 0.75rem 1.5rem; +} + + +/* Accordion - Bordered +-----------------------------------------------------------------*/ + +.accordion-border { + border: 1px solid #DDD; + border-radius: 4px; +} + +.accordion-border .accordion-header { + border-color: #CCC; + padding: 0.75rem; + margin: 0; +} + +.accordion-border .accordion-content { + padding: 0 1.125rem 1.5rem; +} + + +/* Accordion - Large +-----------------------------------------------------------------*/ + +.accordion-lg .accordion-header { + font-size: 1.25rem; +} + + +/* ---------------------------------------------------------------- + Tabs +-----------------------------------------------------------------*/ + + +.tabs { + position: relative; + margin: 0 0 30px 0; +} + +.tab-nav { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0; + border-bottom: 1px solid #DDD; + list-style: none; + padding: 0 15px; +} + +.tab-nav li { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + border: 1px solid #DDD; + border-bottom: 0; + border-left: 0; + height: 41px; + text-align: center; +} + +.tabs-justify .tab-nav li { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.tab-nav li:first-child { + border-left: 1px solid #DDD; +} + +.tab-nav li a { + display: block; + padding: 0 15px; + color: #444; + height: 40px; + line-height: 40px; + background-color: #F2F2F2; + font-weight: bold; +} + +@media (max-width: 767.98px) { + .tab-nav li a { + font-size: 0.875rem; + } +} + +.tab-nav li.ui-tabs-active a { + position: relative; + top: 1px; + background-color: #FFF; +} + + +/* Tabs - Alternate Nav +-----------------------------------------------------------------*/ + +.tabs-alt .tab-nav li { border-color: transparent; } + +.tabs-alt .tab-nav li:first-child { border-left: 0; } + +.tabs-alt .tab-nav li a { background-color: #FFF; } + +.tabs-alt .tab-nav li.ui-tabs-active a { + border: 1px solid #DDD; + border-bottom: 0; +} + + +/* Tabs - Top Border +-----------------------------------------------------------------*/ + +.tabs-tb .tab-nav li.ui-tabs-active a { + top: -1px; + height: 43px; + line-height: 38px; + border-top: 2px solid #1ABC9C; +} + +.tabs-alt.tabs-tb .tab-nav li.ui-tabs-active a { height: 42px; } + + +/* Tabs - Bottom Border +-----------------------------------------------------------------*/ + +.tabs-bb .tab-nav { + padding: 0; +} + +.tabs-bb .tab-nav li { + border: 0 !important; + margin: 0; +} + +.tabs-bb .tab-nav li a { + background-color: transparent; + border-bottom: 2px solid transparent; +} + +.tabs-bb .tab-nav li.ui-tabs-active a { + border-bottom: 2px solid #1ABC9C; + top: -2px; + height: 44px; + line-height: 44px; +} + + +/* Tabs - Navigation Style 2 +-----------------------------------------------------------------*/ + + +.tab-nav.tab-nav2 { + border-bottom: 0; + padding: 0; +} + +.tab-nav.tab-nav2 li { + border: 0; + margin-left: 10px; +} + +.tab-nav.tab-nav2 li:first-child { + margin-left: 0; + border-left: 0; +} + +.tab-nav.tab-nav2 li a { + background-color: #F5F5F5; + border-radius: 2px; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.tab-nav.tab-nav2 li.ui-state-active a { + top: 0; + background-color: #1ABC9C; + color: #FFF; +} + + +/* Tabs - Large Navigation +-----------------------------------------------------------------*/ + + +.tab-nav-lg { + margin-bottom: 20px; + list-style: none; +} + +.tab-nav-lg li { + position: relative; + text-align: center; + padding: 1rem; +} + +.tab-nav-lg li a { + display: inline-block; + color: #444; + font-family: 'Poppins', sans-serif; + font-size: 13px; + font-weight: bold; + text-transform: uppercase; + letter-spacing: 2px; +} + +.tab-nav.tab-nav-lg li i { + display: block; + font-size: 28px; + margin: 0 0 7px; +} + +.tab-nav-lg li.ui-tabs-active a { + color: #1ABC9C; +} + + + +.tab-nav-lg.tab-nav-section li.ui-tabs-active::before, +.tab-nav-lg.tab-nav-section li.ui-tabs-active::after { + content: ''; + position: absolute; + z-index: 2; + top: auto; + bottom: -50px; + border: solid transparent; +} + +.tab-nav-lg.tab-nav-section li.ui-tabs-active::after { + border-top-color: #FFF; + border-width: 16px; + left: 50%; + margin-left: -16px; +} + +.tab-nav-lg.tab-nav-section li.ui-tabs-active::before { + border-top-color: #FFF; + border-width: 16px; + left: 50%; + margin-left: -16px; +} + + +/* Tabs - Content Area +-----------------------------------------------------------------*/ + +.tab-container { + position: relative; + padding: 20px 0 0; +} + +.tabs .tab-content:not(:first-child) { + display: none; +} + +.tab-nav i { + position: relative; + top: 1px; + margin-right: 3px; +} + +/* Tabs - Bordered +-----------------------------------------------------------------*/ + +.tabs-bordered .tab-nav { + padding: 0; +} + +.tabs-bordered .tab-nav li:first-child { margin-left: 0; } + +.tabs-bordered .tab-container { + border: 1px solid #DDD; + border-top: 0; + padding: 20px; +} + + +/* Tabs - Side Tabs +-----------------------------------------------------------------*/ + +@media (min-width: 768px) { + + .side-tabs { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } + + .side-tabs .tab-nav { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + flex-flow: column; + min-width: 200px; + width: auto; + max-width: 100%; + padding: 20px 0; + border-bottom: 0; + border-right: 1px solid #DDD; + } + + .side-tabs .tab-nav li { + border: 1px solid #DDD; + border-right: 0; + border-top: 0; + height: auto; + text-align: left; + } + + .side-tabs .tab-nav li:first-child { + margin-left: 0; + border-top: 1px solid #DDD; + border-left: 1px solid #DDD; + } + + .side-tabs .tab-nav li a { + height: auto; + line-height: 44px; + } + + .side-tabs .tab-nav li.ui-tabs-active a { + top: 0; + right: -1px; + } + + .side-tabs .tab-container { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + padding: 15px 0 0 20px; + } + + .ui-tabs .ui-tabs-hide { + position: absolute !important; + left: -10000px !important; + display: block !important; + } + + + /* Tabs - Side Tabs & Nav Style 2 + -----------------------------------------------------------------*/ + + .side-tabs .tab-nav.tab-nav2 { border: 0; } + + .side-tabs .tab-nav.tab-nav2 li { + border: 0; + margin: 6px 0 0; + } + + .side-tabs .tab-nav.tab-nav2 li:first-child { margin-top: 0; } + + .side-tabs .tab-nav.tab-nav2 li a { box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); } + + .side-tabs .tab-nav.tab-nav2 li.ui-state-active a { right: 0; } + + /* Tabs - Side Tabs & Bordered + -----------------------------------------------------------------*/ + + .tabs-bordered.side-tabs .tab-nav { + position: relative; + padding: 0; + z-index: 2; + margin-right: -1px; + } + + .tabs-bordered.side-tabs .tab-nav li a { + height: auto; + line-height: 44px; + } + + .tabs-bordered.side-tabs .tab-nav li.ui-tabs-active a { + right: -1px; + border-right: 1px solid #FFF; + } + + .tabs-bordered.side-tabs .tab-container { + overflow: hidden; + padding: 20px; + border-top: 1px solid #DDD; + } + +} + + +/* ---------------------------------------------------------------- + Side Navigation +-----------------------------------------------------------------*/ + + +.sidenav { + width: 100%; + padding: 0; + background-color: #FFF; + border-radius: 4px; +} + +.sidenav li { list-style-type: none; } + +.sidenav li a { + display: block; + position: relative; + margin: 0 0 -1px; + padding: 11px 20px 11px 14px; + border: 1px solid #E5E5E5; + border-right-width: 2px; + color: #666; +} + +.sidenav > li:first-child > a { border-radius: 4px 4px 0 0; } + +.sidenav > li:last-child > a { + border-radius: 0 0 4px 4px; + border-bottom-width: 2px; +} + +.sidenav > .ui-tabs-active > a, +.sidenav > .ui-tabs-active > a:hover { + position: relative; + z-index: 2; + border-color: rgba(0,0,0,0.1) !important; + color: #FFF !important; + font-weight: 700; + background-color: #1ABC9C !important; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); +} + +.sidenav li ul { display: none; } + +.sidenav li.ui-tabs-active ul { display: block; } + +.sidenav li li a { + padding: 6px 20px 6px 35px; + font-size: 0.875rem; + border-top: none; + border-bottom: none; +} + +.sidenav li li:first-child a { padding-top: 20px; } + +.sidenav li li:last-child a { padding-bottom: 20px; } + +.sidenav li i { + position: relative; + top: 1px; + margin-right: 6px; + font-size: 0.875rem; + text-align: center; + width: 16px; +} + +/* Chevrons */ +.sidenav .icon-chevron-right { + position: absolute; + width: 14px; + height: 14px; + top: 50%; + left: auto; + right: 6px; + margin-top: -8px; + margin-right: 0; + opacity: .4; + font-size: 12px !important; +} + +.sidenav > li > a:hover { + background-color: #F5F5F5; + color: #222; +} + +.sidenav a:hover .icon-chevron-right { opacity: .5; } + +.sidenav .ui-tabs-active .icon-chevron-right, +.sidenav .ui-tabs-active a:hover .icon-chevron-right { opacity: 1; } + + +/* ---------------------------------------------------------------- + FAQ List +-----------------------------------------------------------------*/ + + +.faqlist li { + margin-bottom: 5px; + font-size: 15px; +} + +.faqlist li a { color: #444; } + +.faqlist li a:hover { color: #1ABC9C !important; } + + +/* ---------------------------------------------------------------- + Clients +-----------------------------------------------------------------*/ + + +.clients-grid, +.testimonials-grid { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: stretch; + align-items: stretch; + list-style: none; + overflow: hidden; +} + +.clients-grid .grid-item, +.testimonials-grid .grid-item { + position: relative; + padding: 20px 0; + -webkit-backface-visibility: hidden; +} + +.clients-grid .grid-item a { opacity: 0.6; } + +body:not(.device-touch) .clients-grid .grid-item a { + -webkit-transition: all .5s ease; + -o-transition: all .5s ease; + transition: all .5s ease; + backface-visibility: hidden; +} + +.clients-grid .grid-item a:hover { opacity: 1; } + +.clients-grid .grid-item a, +.clients-grid .grid-item img { + display: block; + width: 75%; + margin-left: auto; + margin-right: auto; +} + +.clients-grid .grid-item a img { width: 100%; } + +.clients-grid .grid-item::before, +.clients-grid .grid-item::after, +.testimonials-grid .grid-item::before, +.testimonials-grid .grid-item::after { + content: ''; + position: absolute; +} + +.clients-grid .grid-item::before, +.testimonials-grid .grid-item::before { + height: 100%; + top: 0; + left: -1px; + border-left: 1px dashed #DDD; +} + +.clients-grid .grid-item::after, +.testimonials-grid .grid-item::after { + width: 100%; + height: 0; + top: auto; + left: 0; + bottom: -1px; + border-bottom: 1px dashed #DDD; +} + + +/* ---------------------------------------------------------------- + Testimonials +-----------------------------------------------------------------*/ + +/* Testimonials - Grid +-----------------------------------------------------------------*/ + +.testimonials-grid .grid-item { + padding: 2rem; +} + +.testimonials-grid .grid-item .testimonial { + padding: 0; + background-color: transparent !important; + border: 0 !important; + box-shadow: none !important; +} + + +/* Testimonials - Item +-----------------------------------------------------------------*/ + +.testimonial { + position: relative; + padding: 20px; + background-color: #FFF; + border: 1px solid rgba(0,0,0,0.1); + border-radius: 5px; + box-shadow: 0 1px 1px rgba(0,0,0,0.1); +} + +.testi-image { + float: left; + margin-right: 15px; +} + +.testi-image, +.testi-image a, +.testi-image img, +.testi-image i { + display: block; + width: 64px; + height: 64px; +} + +.testi-image i { + text-align: center; + background-color: #EEE; + border-radius: 50%; + line-height: 64px; + font-size: 28px; + color: #888; + text-shadow: 1px 1px 1px #FFF; +} + +.testi-image img { border-radius: 50%; } + +.testi-content { + position: relative; + overflow: hidden; +} + +.testi-content p { + margin-bottom: 0; + font-family: 'PT Serif', serif; + font-style: italic; +} + +.testi-content p::before, +.testi-content p::after { content: '"'; } + +.testi-meta { + margin-top: 10px; + font-size: 15px; + font-weight: bold; + text-transform: uppercase; +} + +.testi-meta::before { content: '\2013'; } + +.testi-meta span { + display: block; + font-weight: normal; + color: #999; + font-size: 13px; + text-transform: none; + padding-left: 10px; +} + + +/* Twitter - Small Scroller +-----------------------------------------------------------------*/ + +.testimonial.twitter-scroll .testi-content p::before, +.testimonial.twitter-scroll .testi-content p::after, +.testimonial.twitter-scroll .testi-meta::before { content: ''; } + +.testimonial.twitter-scroll .testi-meta span { padding-left: 0; } + +.testimonial.twitter-scroll .testi-meta span a { color: #999; } + +.testimonial.twitter-scroll .testi-meta span a:hover { color: #222; } + + +/* Testimonials - Full Width +-----------------------------------------------------------------*/ + +.testimonial.testimonial-full { padding: 30px; } + +.testimonial.testimonial-full[data-animation="fade"] { padding: 30px; } + +.testimonial.testimonial-full[data-animation="fade"] .flexslider { overflow: visible !important; } + +.testimonial-full .testi-image { + float: none; + margin: 0 auto 20px; +} + +.testimonial-full .testi-image, +.testimonial-full .testi-image a, +.testimonial-full .testi-image img, +.testimonial-full .testi-image i { + display: block; + width: 72px; + height: 72px; +} + +.testimonial-full .testi-image i { line-height: 72px; } + +.testimonial-full .testi-content { + text-align: center; + font-size: 18px; +} + +.testimonial-full .testi-meta { margin-top: 15px; } + +.testimonial-full .testi-meta span { padding-left: 0; } + + +/* Testimonial - Section Scroller +-----------------------------------------------------------------*/ + +.section > .testimonial { + padding: 0; + background-color: transparent !important; + border: 0 !important; + box-shadow: none !important; + max-width: 800px; + margin: 0 auto; +} + +.section > .testimonial[data-animation="fade"] { padding: 0; } + +.section > .testimonial .testi-content { font-size: 1.25rem; } + +.section > .testimonial .testi-meta, +.section > .testimonial .testi-meta span { font-size: 0.875rem; } + + +/* Testimonial - Pagination +-----------------------------------------------------------------*/ + +.testimonial .flex-control-nav { + top: auto; + bottom: 6px; + right: 0; +} + +.testimonial .flex-control-nav li { + margin: 0 2px; + width: 6px; + height: 6px; +} + +.testimonial .flex-control-nav li a { + width: 6px !important; + height: 6px !important; + border: none; + background-color: #1ABC9C; + opacity: 0.5; +} + +.testimonial .flex-control-nav li:hover a { opacity: 0.75; } +.testimonial .flex-control-nav li a.flex-active { opacity: 1; } + + +/* Testimonial - Full Scroller +-----------------------------------------------------------------*/ + +.testimonial.testimonial-full .flex-control-nav { + position: relative; + top: 0; + bottom: 0; + right: 0; + left: 0; + height: 6px; + margin-top: 20px; +} + +.testimonial.testimonial-full .flex-control-nav li { + display: inline-block; + float: none; +} + + +/* ---------------------------------------------------------------- + Team +-----------------------------------------------------------------*/ + + +.team, +.team-image { position: relative; } + +.team-image > a, +.team-image img { + display: block; + width: 100%; +} + +.team-desc { text-align: center; } + +.team-desc.team-desc-bg { + background-color: #FFF; + padding: 10px 0 30px; +} + +.team .si-share { + margin-top: 30px; + text-align: left; +} + +.team .si-share .social-icon { + font-size: 0.875rem; + width: 34px; +} + +.team-title { + position: relative; + padding-top: 20px; +} + +.team-title h4 { + display: block; + margin-bottom: 0; + font-size: 1.25rem; + text-transform: uppercase; + letter-spacing: 1px; + font-weight: 700; +} + +.team-title span { + display: block; + color: #1ABC9C; + font-weight: 400; + font-family: 'PT Serif', serif; + font-style: italic; + font-size: 1rem; + margin-top: 5px; +} + +.team-content { + margin-top: 1rem; + color: #777; +} + +.team-content p:last-child { margin-bottom: 0; } + + +/* Team Center +-----------------------------------------------------------------*/ + +.team.center .team-title::after { + left: 50%; + margin-left: -40px; +} + + +/* Team List +-----------------------------------------------------------------*/ + +.team-list .team-desc { + text-align: left; +} + +.team-list .team-title { padding-top: 0; } + +.team .team-desc > .social-icon { margin-top: 20px; } + +.team .team-content ~ .social-icon { margin-top: 30px; } + +.team:not(.team-list) .social-icon { + display: inline-block !important; + vertical-align: middle; + float: none; + margin-left: 4px; + margin-right: 4px; +} + + +/* ---------------------------------------------------------------- + Pricing Boxes +-----------------------------------------------------------------*/ + +.pricing { position: relative; } + +.pricing [class^=col-] { + margin-top: 1.25rem; +} + + +/* Pricing Boxes +-----------------------------------------------------------------*/ + +.pricing-box { + position: relative; + overflow: hidden; + border: 1px solid rgba(0,0,0,0.075); + border-radius: 3px; + background-color: #FFF; +} + + +/* Pricing Boxes - Title +-----------------------------------------------------------------*/ + +.pricing-title { + padding: 1rem 0; + background-color: #F9F9F9; + border-bottom: 1px solid rgba(0,0,0,0.075); + letter-spacing: 1px; +} + +.pricing-title h3 { + margin: 0; + font-size: 1.5rem; + font-weight: bold; + color: #555; +} + +.pricing-title span { + display: block; + color: #777; + font-size: 1rem; + margin: 3px 0; +} + +.pricing-title.title-sm h3 { + font-size: 1.25rem; +} + +.pricing-title.title-sm span { + font-size: 0.875rem; +} + + +/* Pricing Boxes - Price +-----------------------------------------------------------------*/ + +.pricing-price { + position: relative; + padding: 1.5rem 0; + color: #333; + font-size: 4rem; + line-height: 1; +} + +.pricing-price .price-unit { + display: inline-block; + vertical-align: top; + margin: 7px 3px 0 0; + font-size: 28px; + font-weight: normal; +} + +.pricing-price .price-tenure { + vertical-align: baseline; + font-size: 1rem; + font-weight: normal; + letter-spacing: 1px; + color: #999; + margin: 0 0 0 3px; +} + + +/* Pricing Boxes - Features +-----------------------------------------------------------------*/ + +.pricing-features { + border-top: 1px solid rgba(0,0,0,0.075); + border-bottom: 1px solid rgba(0,0,0,0.075); + background-color: #F9F9F9; + padding: 2rem 0; +} + +.pricing-features ul { + margin: 0; + list-style: none; +} + +.pricing-features li { + padding: 0.375rem 0; +} + + +/* Pricing Boxes - Action +-----------------------------------------------------------------*/ + +.pricing-action { padding: 1.25rem 0; } + + +/* Pricing Boxes - Best Price +-----------------------------------------------------------------*/ + +.pricing-highlight { + box-shadow: 0 0 8px rgba(0,0,0,0.1); + z-index: 10; +} + +.pricing-highlight { margin: -20px -1px; } + +.pricing-highlight .pricing-title { + padding: 20px 0; +} + +.pricing-highlight .pricing-title, +.pricing-highlight .pricing-features { + background-color: #fff; +} + +.pricing-highlight .pricing-price { + font-size: 72px; +} + + +/* Pricing Boxes - Simple +-----------------------------------------------------------------*/ + +.pricing-simple, +.pricing-simple .pricing-title, +.pricing-simple .pricing-features { + border: 0; +} + +.pricing-simple .pricing-title, +.pricing-simple .pricing-features { + background-color: transparent; +} + + +/* Pricing Boxes - Minimal +-----------------------------------------------------------------*/ + +.pricing-minimal .pricing-price { + background-color: #FFF; + border-bottom: 1px solid rgba(0,0,0,0.075); +} + +.pricing-minimal .pricing-price::after { display: none; } + + +/* Pricing Boxes - Extended +-----------------------------------------------------------------*/ + +.pricing-extended { + background-color: #FFF; + text-align: left; +} + +.pricing-extended .pricing-title { + background-color: transparent; + padding-top: 0; +} + +.pricing-extended .pricing-features { + border: 0; + background-color: transparent; +} + +.pricing-extended .pricing-action-area { + border-left: 1px solid rgba(0,0,0,0.05); + background-color: #F9F9F9; + padding: 30px; + text-align: center; +} + +.pricing-extended .pricing-action-area .pricing-price, +.pricing-extended .pricing-action-area .pricing-action { padding: 0; } + +.pricing-extended .pricing-action-area .pricing-price { padding-bottom: 20px; } + +.pricing-extended .pricing-action-area .pricing-price::after { display: none; } + +.pricing-extended .pricing-action-area .pricing-price span.price-tenure { + display: block; + margin: 10px 0 0 0; + font-weight: 300; + text-transform: uppercase; + font-size: 0.875rem; +} + +.pricing-extended .pricing-meta { + color: #999; + font-weight: 300; + font-size: 0.875rem; + letter-spacing: 1px; + text-transform: uppercase; + padding-bottom: 10px; +} + +.table-comparison, +.table-comparison th { text-align: center; } + +.table-comparison th:first-child, +.table-comparison td:first-child { + text-align: left; + font-weight: bold; +} + + +/* ---------------------------------------------------------------- + Counter +-----------------------------------------------------------------*/ + + +.counter { + font-size: 42px; + font-weight: 600; + font-family: 'Poppins', sans-serif; +} + +.counter.counter-small { font-size: 28px; } + +.counter.counter-large { font-size: 56px; } + +.counter.counter-xlarge { + font-size: 64px; + font-weight: 400; +} + +.counter.counter-inherit { + font-size: inherit; + font-weight: inherit; +} + +.counter + h5 { + font-weight: 400; + text-transform: uppercase; + letter-spacing: 1px; +} + +.counter.counter-lined + h5::before { + display: block; + position: relative; + margin: 20px auto 25px auto; + content: ''; + width: 15%; + border-top: 2px solid #444; + opacity: 0.9; +} + +.counter.counter-small + h5 { font-size: 0.875rem; } + +.counter.counter-large + h5, +.counter.counter-xlarge + h5 { + font-size: 15px; + font-weight: 300; +} + +.widget .counter + h5 { opacity: 0.7; } + + +/* ---------------------------------------------------------------- + Animated Rounded Skills +-----------------------------------------------------------------*/ + + +.rounded-skill { + display: inline-block; + margin: 0 15px 15px; + display: inline-block; + position: relative; + text-align: center; + font-size: 1.25rem; + font-weight: bold; + color: #333; +} + +body:not(.device-touch) .rounded-skill { + -webkit-transition: opacity .4s ease; + -o-transition: opacity .4s ease; + transition: opacity .4s ease; +} + +.rounded-skill + h5 { margin-bottom: 0; } + +.rounded-skill i { font-size: 42px; } + +.rounded-skill canvas { + position: absolute; + top: 0; + left: 0; +} + + +/* ---------------------------------------------------------------- + Skills Bar +-----------------------------------------------------------------*/ + + +.skills { + margin: 0; + list-style: none; + padding-top: 25px; +} + +.skills li { + position: relative; + margin-top: 38px; + height: 4px; + background-color: #F5F5F5; + box-shadow: inset 0 1px 2px rgba(0,0,0,0.1); + border-radius: 2px; +} + +.skills li:first-child { margin-top: 0; } + +.skills li .progress { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 100%; + background-color: #1ABC9C; + overflow: visible !important; + border-radius: 2px; + -webkit-transition: width 1.2s ease-in-out; + -o-transition: width 1.2s ease-in-out; + transition: width 1.2s ease-in-out; +} + +.skills li .progress-percent { + position: absolute; + top: -28px; + right: 0; + background-color: #333; + color: #F9F9F9; + text-shadow: 1px 1px 1px rgba(0,0,0,0.2); + height: 22px; + line-height: 22px; + padding: 0px 5px; + font-size: 11px; + border-radius: 2px; +} + +.skills li .progress-percent .counter { + font-weight: 400; + font-family: 'Lato', sans-serif; +} + +.progress-percent::after, .progress-percent::before { + top: 100%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} + +.progress-percent::after { + border-top-color: #333; + border-width: 4px; + left: 50%; + margin-left: -4px; +} + +.progress-percent::before { + border-top-color: #333; + border-width: 5px; + left: 50%; + margin-left: -5px; +} + +.skills li > span { + position: absolute; + z-index: 1; + top: -23px; + left: 0; + line-height: 20px; + font-size: 12px; + font-weight: bold; + text-transform: uppercase; + color: #222; +} + +/* ---------------------------------------------------------------- + Quotes & Blockquotes +-----------------------------------------------------------------*/ + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 1.125rem; + border-left: 5px solid #EEE; +} + +.blockquote-reverse { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #EEE; + border-left: 0; + text-align: right; +} + +blockquote.float-start { + max-width: 300px; + margin: 5px 20px 10px 0; + padding-right: 0; +} + +blockquote.float-end { + max-width: 300px; + margin: 5px 0 10px 20px; + padding-left: 0; +} + +.quote { + border: none !important; + position: relative; +} + +.quote p { position: relative; } + +.quote::before { + font-family: 'font-icons'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + content: "\e7ad"; + position: absolute; + width: 48px; + height: 48px; + line-height: 48px; + font-size: 42px; + top: 0; + left: 0; + color: #EEE; +} + +.quote.blockquote-reverse::before { + content: "\e7ae"; + left: auto; + right: 0; +} + + +/* ---------------------------------------------------------------- + Dropcaps & Highlights +-----------------------------------------------------------------*/ + + +.dropcap { + float: left; + font-size: 42px; + line-height: 1; + margin: 0 5px 0 0; + text-transform: uppercase; +} + +.highlight { + padding: 2px 5px; + background-color: #444; + color: #FFF; + border-radius: 2px; +} + +/* ---------------------------------------------------------------- + Text Rotater +-----------------------------------------------------------------*/ + +.text-rotater .t-rotate { + display: none; +} + +.text-rotater .t-rotate.morphext, +.text-rotater .t-rotate.plugin-typed-init { + display: inherit; +} + +.text-rotater .typed-cursor { + font-weight: 400; +} + +.text-rotater > .t-rotate > .animated { + display: inline-block; +} + + +/* ---------------------------------------------------------------- + Owl Carousel CSS +-----------------------------------------------------------------*/ + +.owl-carousel .animated { + -webkit-animation-duration: 1000ms; + animation-duration: 1000ms; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.owl-carousel .owl-animated-in { z-index: 0; } + +.owl-carousel .owl-animated-out { z-index: 1; } + +.owl-carousel .fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOut { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +@keyframes fadeOut { + 0% { opacity: 1; } + 100% { opacity: 0; } +} + +.owl-height { + -webkit-transition:height 500ms ease-in-out; + -o-transition:height 500ms ease-in-out; + transition:height 500ms ease-in-out +} + +.owl-carousel { + display:none; + -webkit-tap-highlight-color:transparent; + position:relative; + z-index:1; + width: 100%; + touch-action: manipulation; +} + +.owl-carousel .owl-stage { + position:relative; + -ms-touch-action: pan-Y; +} + +.owl-carousel .owl-stage::after { + content:"."; + display:block; + clear:both; + visibility:hidden; + line-height:0; + height:0 +} + +.owl-carousel .owl-stage-outer { + position:relative; + overflow:hidden; + -webkit-transform:translate3d(0,0,0); +} + +.owl-carousel.owl-loaded { display:block } + +.owl-carousel.owl-loading { + display:block; + min-height: 100px; + background: no-repeat center center; +} + +.owl-carousel .owl-refresh .owl-item { display:none } + +.owl-carousel .owl-item { + position: relative; + min-height: 1px; + float: left; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; +} + +.owl-carousel .owl-item img { + display:block; + width:100%; + -webkit-transform-style:preserve-3d; +} + +.slider-element .owl-carousel .owl-item img { -webkit-transform-style: preserve-3d; } + +.owl-carousel .owl-nav.disabled, +.owl-carousel .owl-dots.disabled { display: none; } + +.owl-nav .owl-prev, +.owl-nav .owl-next, +.owl-dot, +.owl-dots button { + cursor: pointer; + cursor: hand; + padding: 0; + border: 0; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.owl-carousel.owl-loaded { display: block; } + +.owl-carousel.owl-loading { + opacity: 0; + display: block; +} + +.owl-carousel.owl-hidden { opacity: 0; } + +.mega-menu-content .owl-carousel.owl-hidden { opacity: 1; } + +.owl-carousel.owl-refresh .owl-item { display: none; } + +.owl-carousel.owl-drag .owl-item { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.owl-carousel.owl-grab { + cursor: move; + cursor: -webkit-grab; + cursor: -o-grab; + cursor: -ms-grab; + cursor: grab; +} + +.owl-carousel.owl-rtl { direction: rtl; } + +.owl-carousel.owl-rtl .owl-item { float: right; } + +.no-js .owl-carousel { display: block; } + +.owl-carousel .owl-item .owl-lazy { + opacity:0; + -webkit-transition:opacity 400ms ease; + -o-transition:opacity 400ms ease; + transition:opacity 400ms ease +} + +.owl-carousel .owl-item img { transform-style:preserve-3d } + +.owl-carousel .owl-video-wrapper { + position:relative; + height:100%; + background:#111 +} + +.owl-carousel .owl-video-play-icon { + position: absolute; + height: 64px; + width: 64px; + left: 50%; + top: 50%; + margin-left: -32px; + margin-top: -32px; + background: url("images/icons/play.png") no-repeat; + cursor: pointer; + z-index: 1; + -webkit-backface-visibility: hidden; + -webkit-transition: scale 100ms ease; + -o-transition: scale 100ms ease; + transition: scale 100ms ease; +} + +.owl-carousel .owl-video-play-icon:hover { + -webkit-transition:scale(1.3,1.3); + -o-transition:scale(1.3,1.3); + transition:scale(1.3,1.3) +} + +.owl-carousel .owl-video-playing .owl-video-play-icon, +.owl-carousel .owl-video-playing .owl-video-tn { display:none } + +.owl-carousel .owl-video-tn { + opacity:0; + height:100%; + background-position:center center; + background-repeat:no-repeat; + -webkit-background-size:contain; + -moz-background-size:contain; + -o-background-size:contain; + background-size:contain; + -webkit-transition:opacity 400ms ease; + -o-transition:opacity 400ms ease; + transition:opacity 400ms ease +} + +.owl-carousel .owl-video-frame { + position:relative; + z-index:1; + height: 100%; + width: 100%; +} + + +/* Owl Carousel - Controls +-----------------------------------------------------------------*/ + +.owl-carousel .owl-dots, +.owl-carousel .owl-nav { + text-align: center; + -webkit-tap-highlight-color: transparent; + line-height: 1; +} + +/* Owl Carousel - Controls - Arrows +-----------------------------------------------------------------*/ + +.owl-carousel .owl-nav [class*=owl-] { + position: absolute; + top: 50%; + margin-top: -18px; + left: -36px; + zoom: 1; + width: 36px; + height: 36px; + line-height: 32px; + border: 1px solid rgba(0,0,0,0.2); + color: #666; + background-color: #FFF; + font-size: 18px; + border-radius: 50%; + opacity: 0; + -webkit-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease; +} + +.owl-carousel.with-carousel-dots .owl-nav [class*=owl-] { margin-top: -38px; } + +.slider-element .owl-nav [class*=owl-], +.owl-carousel-full .owl-nav [class*=owl-] { + margin-top: -30px; + left: 0 !important; + height: 60px; + line-height: 60px; + border: none; + color: #EEE; + background-color: rgba(0,0,0,0.4); + font-size: 28px; + border-radius: 0 3px 3px 0; +} + +.owl-carousel-full .with-carousel-dots .owl-nav [class*=owl-] { margin-top: -50px; } + +.owl-carousel .owl-nav .owl-next { + left: auto; + right: -36px; +} + +.slider-element .owl-nav .owl-next, +.owl-carousel-full .owl-nav .owl-next { + left: auto !important; + right: 0 !important; + border-radius: 3px 0 0 3px; +} + +.owl-carousel:hover .owl-nav [class*=owl-] { + opacity: 1; + left: -18px; +} + +.owl-carousel:hover .owl-nav .owl-next { + left: auto; + right: -18px; +} + +.owl-carousel .owl-nav [class*=owl-]:hover { + background-color: #1ABC9C !important; + color: #FFF !important; + text-decoration: none; +} + +.owl-carousel .owl-nav .disabled { display: none !important; } + + +/* Owl Carousel - Controls - Dots +-----------------------------------------------------------------*/ + +.owl-carousel .owl-dots .owl-dot { + display: inline-block; + zoom: 1; + width: 8px; + height: 8px; + margin: 30px 4px 0 4px; + opacity: 0.5; + border-radius: 50%; + background-color: #1ABC9C; + -webkit-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease; +} + +.owl-carousel .owl-dots .owl-dot.active, +.owl-carousel .owl-dots .owl-dot:hover { opacity: 1; } + + +/* Owl Carousel - Controls - Dots - Positions +-----------------------------------------------------------------*/ +.owl-carousel[class*=owl-nav-pos-], +.owl-carousel[class*=owl-dots-pos-] +.owl-carousel[class*=owl-img-pos-] { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; +} + +.owl-carousel.owl-nav-pos-1 .owl-nav, +.owl-carousel.owl-dots-pos-1 .owl-dots, +.owl-carousel.owl-content-pos-1 .owl-stage-outer { + order: 1; +} + +.owl-carousel.owl-nav-pos-2 .owl-nav, +.owl-carousel.owl-dots-pos-2 .owl-dots, +.owl-carousel.owl-content-pos-2 .owl-stage-outer { + order: 2; + margin: 20px 0; +} + +.owl-carousel.owl-nav-pos-3 .owl-nav, +.owl-carousel.owl-dots-pos-3 .owl-dots, +.owl-carousel.owl-content-pos-3 .owl-stage-outer { + order: 3; +} + +.owl-carousel.owl-dots-pos-2 .owl-dots .owl-dot, +.owl-carousel.owl-dots-pos-3 .owl-dots .owl-dot { + margin-top: 0; +} + +.owl-carousel.owl-nav-pos-left .owl-nav, +.owl-carousel.owl-nav-pos-right .owl-nav, +.owl-carousel.owl-dots-pos-left .owl-dots, +.owl-carousel.owl-dots-pos-right .owl-dots { + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; +} + +.owl-carousel.owl-dots-pos-left .owl-dots, +.owl-carousel.owl-nav-pos-left .owl-nav { + -ms-flex-pack: start; + justify-content: flex-start; +} + +.owl-carousel.owl-dots-pos-right .owl-dots, +.owl-carousel.owl-nav-pos-right .owl-nav { + -ms-flex-pack: end; + justify-content: flex-end; +} + +.owl-carousel.with-carousel-dots.owl-dots-pos-top .owl-nav [class*=owl-] { margin-top: 0; } + +/* Owl Carousel - Controls - Dots - Sizes +-----------------------------------------------------------------*/ +.owl-carousel { + --owl-nav-sizes: 36px; + --owl-dots-gutters: 4px; + --owl-dots-sizes: 8px; + --owl-nav-bg: var(--themecolor, #1ABC9C); + --owl-nav-margin: calc(var(--owl-nav-sizes) / -2); + --owl-nav-with-dots: calc( var(--owl-nav-margin) - calc( calc( 30px + var(--owl-dots-sizes) ) / 2 ) ); +} + +.owl-carousel.owl-dots-size-sm { + --owl-dots-sizes: 4px; + --owl-dots-gutters: 2px; +} + +.owl-carousel.owl-dots-size-lg { + --owl-dots-sizes: 12px; + --owl-dots-gutters: 5px; +} + +.owl-carousel.owl-dots-size-xl { + --owl-dots-sizes: 16px; + --owl-dots-gutters: 6px; +} + +.owl-carousel .owl-dots .owl-dot { + width: var(--owl-dots-sizes); + height: var(--owl-dots-sizes); + background-color: var(--owl-nav-bg); + margin-left: var(--owl-dots-gutters); + margin-right: var(--owl-dots-gutters); + transition: all .3s; +} + +.owl-carousel.owl-nav-hover-fixed[class*=owl-nav-pos-] .owl-nav .disabled { + display: inline-block !important; + pointer-events: none; + opacity: .4 !important; +} + +/* Owl Carousel - Controls - Dots - Border +-----------------------------------------------------------------*/ +.owl-carousel.owl-dots-border .owl-dots .owl-dot:not(.active) { + opacity: 1; + background-color: transparent; + border: 1px solid var(--owl-nav-bg); +} + +.owl-carousel.owl-dots-border .owl-dots .owl-dot.active { + border-color: transparent; +} + +/* Owl Carousel - Controls - Dots - square +-----------------------------------------------------------------*/ +.owl-carousel.owl-dots-square .owl-dots .owl-dot { + border-radius: 0; + --owl-dots-sizes: 10px; +} + +/* Owl Carousel - Controls - Dots - square +-----------------------------------------------------------------*/ +.owl-carousel.owl-dots-rounded .owl-dots .owl-dot { + --owl-dots-sizes: 10px; + border-radius: 2px; +} + +/* Owl Carousel - Controls - Dots - Dashed +-----------------------------------------------------------------*/ +.owl-carousel.owl-dots-dashed .owl-dots .owl-dot { + --owl-dots-sizes: 16px; + opacity: .4; + height: 4px; + border-radius: 4px; +} + +.owl-carousel.owl-dots-dashed .owl-dots .owl-dot.active { + --owl-dots-sizes: 32px; + opacity: 1; +} + +/* Owl Carousel - Controls - Dots - Numbers +-----------------------------------------------------------------*/ +.owl-carousel.owl-dots-number .owl-dots { + --owl-dots-sizes: 28px; + counter-reset: dots; + --owl-nav-bg: #FFF; +} + +.owl-carousel.owl-dots-number .owl-dots .owl-dot { + position: relative; + width: auto; + opacity: .3; +} + +.owl-carousel.owl-dots-number .owl-dots .owl-dot.active { + opacity: 1; +} + +.owl-carousel.owl-dots-number .owl-dots .owl-dot:before { + display: inline-block; + counter-increment: dots; + content: counter(dots, decimal-leading-zero); +} + +.owl-carousel.owl-dots-number .owl-dots .owl-dot span { + position: relative; + display: inline-block; + width: 0px; + height: 2px; + background-color: #666; + top: -5px; + margin-left: 5px; + transition: width .4s ease-in-out; +} + +.owl-carousel.owl-dots-number .owl-dots .owl-dot.active span { + width: 30px; +} + +/* Owl Carousel - Controls - Arrows - Sizes +-----------------------------------------------------------------*/ + +.owl-carousel .owl-nav [class*=owl-] { + left: calc(-1 * var(--owl-nav-sizes)); + width: var(--owl-nav-sizes); + height: var(--owl-nav-sizes); + line-height: calc(calc(-1 * var(--owl-nav-sizes)) - 4px); + font-size: calc(var(--owl-nav-sizes) / 2); + margin-top: var(--owl-nav-margin); +} + +.owl-carousel.with-carousel-dots .owl-nav [class*=owl-] { + margin-top: var(--owl-nav-with-dots); +} + +.owl-carousel .owl-nav .owl-next { + left: auto; + right: calc(-1 * var(--owl-nav-sizes)); +} + +.slider-element .owl-nav .owl-next, +.owl-carousel-full .owl-nav .owl-next { + left: auto !important; + right: 0 !important; +} + +.owl-carousel.owl-nav-hover-fixed .owl-nav [class*=owl-], +.owl-carousel:hover .owl-nav [class*=owl-] { + opacity: 1; + left: calc(calc(-1 * var(--owl-nav-sizes)) / 2); +} + +.owl-carousel.owl-nav-hover-fixed .owl-nav .owl-next, +.owl-carousel:hover .owl-nav .owl-next { + left: auto; + right: calc(calc(-1 * var(--owl-nav-sizes)) / 2); +} + +.owl-carousel .owl-nav [class*=owl-]:hover { + background-color: var(--owl-nav-bg) !important; +} + +.slider-element .owl-nav [class*=owl-], +.owl-carousel-full .owl-nav [class*=owl-] { + margin-top: -30px; + height: calc(var(--owl-nav-sizes) * 1.6666666667); + line-height: calc(var(--owl-nav-sizes) * 1.6666666667); + font-size: calc(calc(var(--owl-nav-sizes) * 1.6666666667) / 2); +} + +.owl-carousel-full .with-carousel-dots .owl-nav [class*=owl-] { + margin-top: calc( calc(calc(var(--owl-nav-sizes) * 1.6666666667) / -2)) - calc( calc( 30px + var(--owl-dots-sizes) ) / 2 ); +} + +.owl-carousel.owl-nav-hover-fixed[class*=owl-nav-pos-] .owl-nav [class*=owl-] { + position: relative; + top: auto; + left: auto; + right: auto; + margin: 0; +} + +.owl-carousel.owl-nav-hover-fixed[class*=owl-nav-pos-] .owl-nav .owl-prev { + margin-right: 5px; +} + +.owl-carousel.owl-nav-hover-fixed[class*=owl-nav-pos-] .owl-nav .owl-next { + margin-left: 5px; +} + +.owl-carousel.owl-nav-text .owl-nav [class*=owl-] { + width: auto; + height: auto; + line-height: 1.5; + font-size: 0.925rem; + border-radius: 3px; + padding: 4px 8px; +} + +.owl-carousel.owl-nav-text .owl-nav [class*=owl-] i { + position: relative; + top: 1px; +} + + + +/* ---------------------------------------------------------------- + Flip Cards +-----------------------------------------------------------------*/ + +.flip-card { + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-perspective: 1000px; + perspective: 1000px; +} + +.flip-card-front, +.flip-card-back { + background-size: cover; + background-position: center; + -webkit-transition: -webkit-transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); + transition: -webkit-transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); + -o-transition: transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); + transition: transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); + transition: transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1), + -webkit-transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + width: 100%; + height: 280px; + border-radius: 6px; + color: #FFF; + font-size: 1.5rem; +} + +.flip-card-back { background-color: #666; } + +.flip-card:hover .flip-card-front, +.flip-card:hover .flip-card-back { + -webkit-transition: -webkit-transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); + transition: -webkit-transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); + -o-transition: transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); + transition: transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); + transition: transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1), + -webkit-transform 0.7s cubic-bezier(0.4, 0.2, 0.2, 1); +} + +.flip-card-front.no-after::after, +.flip-card-back.no-after::after { content: none } + +.flip-card-front::after, +.flip-card-back::after { + position: absolute; + top: 0; + left: 0; + z-index: 1; + width: 100%; + height: 100%; + content: ""; + display: block; + opacity: 0.6; + background-color: #000; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + border-radius: 6px; +} + +.flip-card-back { + position: absolute; + top: 0; + left: 0; + width: 100%; +} + +.flip-card-inner { + -webkit-transform: translateY(-50%) translateZ(60px) scale(0.94); + transform: translateY(-50%) translateZ(60px) scale(0.94); + top: 50%; + position: absolute; + left: 0; + width: 100%; + padding: 2rem; + -webkit-box-sizing: border-box; + box-sizing: border-box; + outline: 1px solid transparent; + -webkit-perspective: inherit; + perspective: inherit; + z-index: 2; +} + +.flip-card-back { + -webkit-transform: rotateY(180deg); + transform: rotateY(180deg); + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.flip-card-front, +.flip-card:hover .flip-card-back { + -webkit-transform: rotateY(0deg); + transform: rotateY(0deg); + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.flip-card:hover .flip-card-front { + -webkit-transform: rotateY(-180deg); + transform: rotateY(-180deg); + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.top-to-bottom .flip-card-back { + -webkit-transform: rotateX(180deg); + transform: rotateX(180deg); + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.top-to-bottom .flip-card-front, +.top-to-bottom:hover .flip-card-back { + -webkit-transform: rotateX(0deg); + transform: rotateX(0deg); + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.top-to-bottom:hover .flip-card-front { + -webkit-transform: rotateX(-180deg); + transform: rotateX(-180deg); + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.flip-card-inner span { + font-size: 18px; + line-height: 20px; + font-weight: 300; +} + +.flip-card-inner p { + position: relative; + font-size: 1rem; + margin-bottom: 0; + color: rgba(255, 255, 255, 0.7); +} + +/*.owl-carousel .owl-stage { padding: 20px 0; }*/ + + +/* ---------------------------------------------------------------- + Overlays +-----------------------------------------------------------------*/ + + +.bg-overlay, +.bg-overlay-bg, +.bg-overlay-content { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + overflow: hidden; +} + +.bg-overlay [data-hover-animate]:not(.animated) { + opacity: 0; +} + +.bg-overlay { + z-index: 5; +} + +.bg-overlay-content { + display: -ms-flexbox; + display: flex; + align-items: center; + justify-content: center; + z-index: 1; + padding: 20px; +} + +.bg-overlay-bg { + background-color: rgba(255,255,255,0.85); +} + +.dark .bg-overlay-bg, +.bg-overlay-bg.dark { + background-color: rgba(0,0,0,0.5); +} + + +.text-overlay-mask { + opacity: 0.85; + top: auto; + bottom: 0; + height: auto; + padding: 40px 15px 15px; + background: -moz-linear-gradient(top, rgba(0,0,0,0) 0%, rgba(0,0,0,0.85) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(0,0,0,0)), color-stop(100%,rgba(0,0,0,0.85))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,0.85) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,0.85) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(0,0,0,0) 0%,rgba(0,0,0,0.85) 100%); /* IE10+ */ + background: linear-gradient(to bottom, rgba(0,0,0,0) 0%,rgba(0,0,0,0.85) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00000000', endColorstr='#a6000000',GradientType=0 ); /* IE6-9 */ +} + +.overlay-trigger-icon { + display: block; + width: 40px; + height: 40px; + line-height: 40px; + margin: 0 0.25rem; + font-size: 1.125rem; + text-align: center; + border-radius: 50%; + -webkit-backface-visibility: hidden; + transition: all .3s ease; +} + +.overlay-trigger-icon .icon-line-play { + position: relative; + left: 2px; +} + +.overlay-trigger-icon.size-sm { + width: 30px; + height: 30px; + line-height: 30px; + margin: 0 0.5rem; + font-size: 0.875rem; +} + +.overlay-trigger-icon.size-lg { + width: 64px; + height: 64px; + line-height: 64px; + margin: 0 0.5rem; + font-size: 1.5rem; +} + + +/* News Carousel Overlays +-----------------------------------------------------------------*/ + +.news-carousel .rounded-skill { + position: absolute; + margin: 0 !important; + top: 30px; + right: 30px; + color: #FFF; + font-weight: 700; +} + + +/* ---------------------------------------------------------------- + Forms +-----------------------------------------------------------------*/ + +.sm-form-control { + display: block; + width: 100%; + height: 38px; + padding: 8px 14px; + font-size: 15px; + line-height: 1.42857143; + color: #555555; + background-color: #ffffff; + background-image: none; + border: 2px solid #DDD; + border-radius: 0 !important; + -webkit-transition: border-color ease-in-out .15s; + -o-transition: border-color ease-in-out .15s; + transition: border-color ease-in-out .15s; +} + +.sm-form-control:focus { + border-color: #AAA; + outline: 0; + -webkit-box-shadow: none; + box-shadow: none; +} + +.sm-form-control::-moz-placeholder { + color: #999; + opacity: 1; +} + +.sm-form-control:-ms-input-placeholder { color: #999; } +.sm-form-control::-webkit-input-placeholder { color: #999; } + +.sm-form-control[disabled], +.sm-form-control[readonly], +fieldset[disabled] .sm-form-control { + cursor: not-allowed; + background-color: #eeeeee; + opacity: 1; +} + +.sm-form-control { height: auto; } + +.form-control { border-radius: 3px; } + +.form-control:active, +.form-control:focus { + border-color: #999; + box-shadow: none; +} + +label { + display: inline-block; + font-size: 13px; + font-weight: 700; + font-family: 'Poppins', sans-serif; + text-transform: uppercase; + letter-spacing: 1px; + color: #555; + margin-bottom: 10px; + cursor: pointer; +} + +label.label-muted { + color: #999; + font-weight: normal; + margin-right: 5px; +} + + +/* ---------------------------------------------------------------- + Contact Form +-----------------------------------------------------------------*/ + + +.contact-form-overlay { + position: relative; + background-color: #FFF; + z-index: 10; + border-radius: 4px; + box-shadow: 0 1px 10px rgba(0,0,0,0.15); +} + +label.error { + margin-top: 5px; + color: #E42C3E; + font-weight: 400; +} + +label.error { display: none !important; } + +.show-error-msg + label.error { display: block !important; } + +input[type=checkbox]:not(:checked) + label.error { display: block !important; } + +.form-control.error, +.sm-form-control.error { border-color: #E42C3E; } + + +/* ---------------------------------------------------------------- + Google Maps +-----------------------------------------------------------------*/ + + +.gmap { + position: relative; + width: 100%; + height: 450px; +} + +.gmap img { max-width: none !important; } + +.gm-style .gm-style-iw h3 span { + font-size: inherit; + font-family: inherit; +} + +#map-overlay { + position: relative; + padding: 100px 0; +} + +#map-overlay .gmap { + position: absolute; + height: 100%; + top: 0; + left: 0; +} + + +/* ---------------------------------------------------------------- + Google Custom Search +-----------------------------------------------------------------*/ + + +#content .cse .gsc-control-cse, +#content .gsc-control-cse, +#content .gsc-above-wrapper-area, +#content .gsc-adBlock, +#content .gsc-thumbnail-inside, +#content .gsc-url-top, +#content .gsc-table-result, +#content .gsc-webResult, +#content .gsc-result { padding: 0 !important; } + +#content .gsc-selected-option-container { width: auto !important; } + +#content .gsc-result-info { padding-left: 0 !important; } + +#content .gsc-above-wrapper-area-container, +#content .gsc-table-result { margin-bottom: 10px; } + +#content .gcsc-branding { display: none; } + +#content .gsc-results, +#content .gsc-webResult { width: 100% !important; } + +#content .gs-no-results-result .gs-snippet, +#content .gs-error-result .gs-snippet { margin: 0 !important; } + + +/* ---------------------------------------------------------------- + Heading Styles +-----------------------------------------------------------------*/ + + +/* Titular +-----------------------------------------------------------------*/ + +.titular-title { + font-weight: 500; + letter-spacing: -1px; +} + +h1.titular-title { font-size: 3.25rem; } + +h2.titular-title { font-size: 2.75rem; } + +h3.titular-title { font-size: 2rem; } + +.titular-sub-title { + margin: 0; + font-weight: 600; + letter-spacing: 4px; + font-size: 1rem; + text-transform: uppercase; +} + +.titular-title + .titular-sub-title { + margin-top: -25px; + margin-bottom: 30px; +} + + +/* Block Titles +-----------------------------------------------------------------*/ + +.title-block { + padding: 2px 0 3px 20px; + border-left: 7px solid #1ABC9C; + margin-bottom: 30px; +} + +.title-block-right { + padding: 2px 20px 3px 0; + border-left: 0; + border-right: 7px solid #1ABC9C; + text-align: right; +} + +.title-block h1, +.title-block h2, +.title-block h3, +.title-block h4 { margin-bottom: 0; } + +.title-block > span { + display: block; + margin-top: 4px; + color: #555; + font-weight: 300; +} + +.title-block h1 + span, +.title-block h2 + span { + font-size: 1.25rem; +} + +.title-block h3 + span { + font-size: 1.125rem; +} + +.title-block h4 + span { + font-size: 0.9375px; +} + + +/* Heading Block - with Subtitle +-----------------------------------------------------------------*/ + +.heading-block { margin-bottom: 50px; } + +.heading-block h1, +.heading-block h2, +.heading-block h3, +.heading-block h4, +.emphasis-title h1, +.emphasis-title h2 { + margin-bottom: 0; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 1px; + color: #333; +} + +.emphasis-title h1, +.emphasis-title h2 { + font-weight: 400; + letter-spacing: 0; + text-transform: none; +} + +.heading-block h1 { font-size: 32px; } + +.heading-block h2 { font-size: 30px; } + +.heading-block h3 { font-size: 1.75rem; } + +.heading-block h4 { + font-size: 1.25rem; + font-weight: 700; +} + +.heading-block > span:not(.before-heading) { + display: block; + margin-top: 10px; + font-weight: 300; + color: #777; +} + +.heading-block .before-heading { margin-bottom: 7px; } + +.heading-block.center > span, +.heading-block.text-center > span, +.center .heading-block > span, +.text-center .heading-block > span { + max-width: 700px; + margin-left: auto; + margin-right: auto; +} + +@media (min-width: 768px) { + .text-md-start .heading-block > span { + max-width: none !important; + } +} + +.heading-block h1 + span { font-size: 1.5rem; } + +.heading-block h2 + span { font-size: 1.25rem; } + +.heading-block h3 + span, +.heading-block h4 + span { font-size: 1.25rem; } + +.heading-block::after { + content: ''; + display: block; + margin-top: 30px; + width: 40px; + border-top: 2px solid #444; +} + +.center .heading-block::after, +.text-center .heading-block::after, +.heading-block.center::after, +.heading-block.text-center::after { margin: 30px auto 0; } + +@media (min-width: 768px) { + .text-md-start .heading-block::after { + margin-left: 0 !important; + } +} + +.text-end .heading-block, +.heading-block.text-end, +.heading-block.title-right { direction: rtl; } + +.heading-block.border-0::after, +.heading-block.border-bottom-0::after { display: none; } + +.heading-block.border-color::after { border-color: #1ABC9C; } + + +/* Emphasis Title +-----------------------------------------------------------------*/ + +.emphasis-title { margin: 0 0 50px; } + +.emphasis-title h1, +.emphasis-title h2 { + font-size: 64px; + letter-spacing: -2px; +} + +.emphasis-title h1 strong, +.emphasis-title h2 strong { font-weight: 700; } + + +/* Justify Border Title +-----------------------------------------------------------------*/ + +.fancy-title { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + margin-bottom: 2rem; +} + +.fancy-title h1, +.fancy-title h2, +.fancy-title h3, +.fancy-title h4, +.fancy-title h5, +.fancy-title h6 { + position: relative; + margin-bottom: 0; +} + +.fancy-title::before, +.fancy-title::after { + content: ''; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + height: 0; + border-top: 3px double #E5E5E5; +} + +.fancy-title::before { + display: none; + margin-right: 0.75rem; +} + +.fancy-title::after { + margin-left: 0.75rem; +} + +.title-border::before, +.title-border::after { + border-top-width: 1px; + border-top-style: solid; +} + +.title-border-color::before, +.title-border-color::after { + border-top: 1px solid #1ABC9C !important; +} + + +/* Fancy Title - Center Align +-----------------------------------------------------------------*/ + +.title-center::before { + display: block; +} + + +/* Fancy Title - Right Align +-----------------------------------------------------------------*/ + +.title-right::before { + display: block; +} + +.title-right::after { + display: none; +} + + +/* Fancy Title - Bottom Short Border +-----------------------------------------------------------------*/ + +.title-bottom-border::before, +.title-bottom-border::after { + display: none; +} + +.title-bottom-border h1, +.title-bottom-border h2, +.title-bottom-border h3, +.title-bottom-border h4, +.title-bottom-border h5, +.title-bottom-border h6 { + width: 100%; + padding: 0 0 0.75rem; + border-bottom: 2px solid #1ABC9C; +} + + +/* Sub Heading +-----------------------------------------------------------------*/ + +.before-heading { + display: block; + margin: 0 0 5px; + font-size: 1rem; + font-family: 'PT Serif', serif; + font-style: italic; + font-weight: 400; + color: #999; +} + + +@media (max-width: 767.98px){ + + .title-block h1 + span { font-size: 18px; } + + .title-block h2 + span { font-size: 17px; } + + .title-block h3 + span { font-size: 15px; } + + .title-block h4 + span { font-size: 13px; } + + .heading-block h1 { font-size: 30px; } + + .heading-block h2 { font-size: 26px; } + + .heading-block h3 { font-size: 22px; } + + .heading-block h4 { font-size: 19px; } + + .heading-block h1 + span { font-size: 20px; } + + .heading-block h2 + span { font-size: 18px; } + + .heading-block h3 + span, + .heading-block h4 + span { font-size: 17px; } + + .emphasis-title h1, + .emphasis-title h2 { font-size: 44px !important; } + +} + + +/* ---------------------------------------------------------------- + Divider +-----------------------------------------------------------------*/ + + +.divider { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + overflow: hidden; + margin: 3rem auto; + color: #E5E5E5; + width: 100%; +} + +.divider.divider-margin-lg { margin: 5rem auto; } + +.divider::after, +.divider::before { + content: ''; + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + height: 1px; + background-color: #EEE; +} + +.divider::before { + display: none; + margin-right: 0.5rem; +} + +.divider::after { + margin-left: 0.5rem; +} + +.divider.divider-thick::after, +.divider.divider-thick::before { height: 3px; } + +.divider.divider-sm { width: 55%; } + +.divider.divider-xs { width: 35%; } + +.divider i, +.divider a, +.divider-text { + position: relative; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 24px; + max-width: 100%; + line-height: 1; + font-size: 18px !important; + text-align: center; +} + +.divider a, +.divider-text { + width: auto; + color: inherit; + -webkit-transition: all .3s ease; + -o-transition: all .3s ease; + transition: all .3s ease; +} + +.divider a:hover { color: #888; } + + +/* Divider - Icon Align Right +-----------------------------------------------------------------*/ + +.divider.divider-right::before { + display: block; +} + +.divider.divider-right::after { + display: none; +} + + +/* Divider - Icon Align Center +-----------------------------------------------------------------*/ + +.divider.divider-center::before { + display: block; +} + + +/* Divider - Rounded Icon +-----------------------------------------------------------------*/ + +.divider.divider-rounded i, +.divider.divider-border i { + width: 40px; + height: 40px; + line-height: 40px; + color: #BBB; + background-color: #F5F5F5; + border-radius: 50%; +} + +.divider.divider-rounded::before, +.divider.divider-border::before, +.divider.divider-rounded::after, +.divider.divider-border::after { + margin-left: 0; + margin-right: 0; +} + + +/* Divider - Rounded & Border +-----------------------------------------------------------------*/ + +.divider.divider-border { color: #E5E5E5; } + +.divider.divider-border i { + line-height: 38px; + background-color: transparent; + border: 1px solid #EEE; +} + + +/* Divider - Line Only +-----------------------------------------------------------------*/ + +.divider.divider-line::before, +.divider.divider-line::after { + margin-left: 0; + margin-right: 0; +} + + +/* ---------------------------------------------------------------- + Magazine Specific Classes +-----------------------------------------------------------------*/ + +.top-advert { + padding: 5px; + border-left: 1px solid #EEE; + border-right: 1px solid #EEE; +} + +.top-advert a, +.top-advert img { display: block; } + +.bnews-title { + display: block; + float: left; + margin-top: 2px; + padding-top: .3em; + text-transform: uppercase; +} + +.bnews-slider { + float: left; + width: 970px; + margin-left: 20px; + min-height: 0; +} + +/* ---------------------------------------------------------------- + Go To Top +-----------------------------------------------------------------*/ + + +#gotoTop { + display: none; + z-index: 599; + position: fixed; + width: 40px; + height: 40px; + background-color: #333; + background-color: rgba(0,0,0,0.3); + font-size: 1.25rem; + line-height: 36px; + text-align: center; + color: #FFF; + top: auto; + left: auto; + right: 30px; + bottom: 50px; + cursor: pointer; + border-radius: 2px; +} + +body:not(.device-touch) #gotoTop { + transition: background-color .2s linear; + -webkit-transition: background-color .2s linear; + -o-transition: background-color .2s linear; +} + +.stretched #gotoTop { bottom: 30px; } + +#gotoTop:hover { background-color: #1ABC9C; } + + +/* ---------------------------------------------------------------- + Read More +-----------------------------------------------------------------*/ + + +.read-more-wrap { + position: relative; + overflow: hidden; + -webkit-transition: height .5s ease; + transition: height .5s ease; +} + +.read-more-wrap .read-more-mask { + position: absolute; + z-index: 9; + top: auto; + bottom: 0; + left: 0; + width: 100%; + min-height: 60px; + height: 35%; + background-image: linear-gradient( rgba(255,255,255,0), rgba(255,255,255,1 ) ); +} + +.read-more-trigger { + -webkit-transition: all .5s ease; + transition: all .5s ease; +} + +.read-more-trigger i { + position: relative; + top: 1px; + margin-left: 3px; +} + +.read-more-wrap .read-more-trigger { + position: absolute; + display: block !important; + z-index: 10; + top: auto; + bottom: 5px; + left: 5px; + margin: 0 !important; +} + +.read-more-wrap .read-more-trigger-center { + left: 50%; + transform: translateX(-50%); +} + +.read-more-wrap .read-more-trigger-right { + left: auto; + right: 5px; +} + + +/* ---------------------------------------------------------------- + GDPR Settings +-----------------------------------------------------------------*/ + +.gdpr-settings { + position: fixed; + max-width: calc(100vw - 2rem); + max-height: 60vh; + overflow-y: scroll; + margin-bottom: 1rem; + border-radius: 4px; + top: auto; + bottom: 0; + left: 1rem; + opacity: 0; + padding: 3rem; + z-index: 999; + background-color: #EEE; + transition: all .3s ease; +} + +.gdpr-settings-sm { + max-width: 30rem; + margin-right: 1rem; +} + +.gdpr-settings-sm.gdpr-settings-right { + left: auto; + right: 1rem; + margin-right: 0; + margin-left: 1rem; +} + +@media (min-width: 768px) { + .gdpr-settings { + max-height: none; + overflow: auto; + } +} + +.gdpr-settings.dark { + background-color: #111; +} + + +.gdpr-container { + position: relative; + height: auto; +} + +.gdpr-blocked-message { + display: flex; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1; + text-align: center; + align-items: center; + justify-content: center; + flex-direction: column; +} + +.gdpr-blocked-message a { + text-decoration: underline !important; +} + +.gdpr-container:not(.gdpr-content-active) { + min-height: 250px; +} + +.gdpr-container.gdpr-content-active { + min-height: 0 !important; +} + +.gdpr-container.gdpr-content-active .gdpr-blocked-message { + display: none; +} + + +/* ---------------------------------------------------------------- + Error 404 +-----------------------------------------------------------------*/ + + +.error404 { + display: block; + font-size: 18vw; + font-weight: 700; + color: #DDD; + line-height: 1; + letter-spacing: 4px; +} + +.error404-wrap .container { z-index: 7; } + +.error404-wrap .error404 { + line-height: 0.9; + margin-bottom: 40px; + font-weight: bold; + font-size: 19vw; + color: #FFF !important; + opacity: 0.2; + text-shadow: 1px 1px 5px rgba(0,0,0,0.4); +} + +.error404-wrap .heading-block h4 { + font-weight: 300; + margin-bottom: 8px; +} + +.error404-wrap .heading-block span { font-size: 1.125rem; } + +.error404-wrap form { max-width: 500px; } + + +/* ---------------------------------------------------------------- + Landing Pages +-----------------------------------------------------------------*/ + +.landing-wide-form { + background: rgba(0,0,0,0.3); + padding: 30px; + border-radius: 3px; +} + +.landing-form-overlay { + position: absolute; + z-index: 10; + top: auto; + left: auto; + right: 0; + bottom: -154px; + background-color: rgba(0,0,0,0.6); + border-radius: 3px 3px 0 0; +} + +.landing-video { + z-index: 1; + width: 560px; + height: 315px; + margin: 22px 0 0 95px; + overflow: hidden; +} + +.landing-promo h3 { font-size: 1.75rem; } + +.landing-promo > .container > span { font-size: 1.125rem; } + + +/* ---------------------------------------------------------------- + Preloaders +-----------------------------------------------------------------*/ + + +.preloader, +.preloader2, +.form-process { + display: block; + width: 100%; + height: 100%; + background: center center no-repeat #FFF; +} + +.preloader2 { background-color: transparent; } + +.form-process { + display: none; + position: absolute; + top: 0; + left: 0; + z-index: 3; + background-color: transparent; +} + +.form-process::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #FFF; + opacity: 0.7; + z-index: -1; +} + + +/* ---------------------------------------------------------------- + Footer +-----------------------------------------------------------------*/ + + +#footer { + position: relative; + background-color: #EEE; + border-top: 5px solid rgba(0,0,0,0.2); +} + +@media (min-width: 992px) { + .sticky-footer #slider:not(.slider-parallax-invisible), + .sticky-footer #page-submenu, + .sticky-footer #page-title, + .sticky-footer #content { + z-index: 2; + } + + .sticky-footer #content { + transform: translate3d(0,0,0); + } + + .sticky-footer #footer { + position: sticky; + top: auto; + bottom: 0; + left: 0; + } +} + +#footer .footer-widgets-wrap { + position: relative; + padding: 40px 0; +} + +#copyrights { + padding: 20px 0; + background-color: #DDD; + font-size: 0.875rem; + line-height: 1.8; +} + +#copyrights i.footer-icon { + position: relative; + top: 1px; + font-size: 0.875rem; + width: 14px; + text-align: center; + margin-right: 3px; +} + +.copyright-links a { + display: inline-block; + margin: 0 3px; + color: #333; + border-bottom: 1px dotted #444; +} + +.copyright-links a:hover { + color: #555; + border-bottom: 1px solid #666; +} + +.copyrights-menu { margin-bottom: 10px; } + +.copyrights-menu a { + font-size: 0.875rem; + margin: 0 10px; + border-bottom: 0 !important; +} + +#copyrights a:first-child { margin-left: 0; } + +#copyrights.text-end a:last-child { margin-right: 0; } + +.footer-logo { + display: block; + margin-bottom: 30px; +} + + +/* ---------------------------------------------------------------- + Widgets +-----------------------------------------------------------------*/ + + +.widget { + position: relative; + margin-top: 50px; +} + +.widget p { line-height: 1.7; } + +.sidebar-widgets-wrap .widget { + padding-top: 50px; + border-top: 1px solid #EEE; +} + +.widget:first-child { margin-top: 0; } + +.sidebar-widgets-wrap .widget:first-child { + padding-top: 0; + border-top: 0; +} + +@media (min-width: 768px) and (max-width: 991.98px) { + .sidebar-widgets-wrap { + position: relative; + display: -ms-flex; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin: 0 -20px -40px -20px; + } + + .sidebar-widgets-wrap .widget { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + margin: 0 0 40px 0; + padding-top: 0; + padding-left: 20px; + padding-right: 20px; + border-top: 0; + } +} + +.widget > h4 { + margin-bottom: 25px; + font-size: 15px; + font-weight: 600; + letter-spacing: 2px; + text-transform: uppercase; +} + +.sidebar-widgets-wrap .widget > h4 { letter-spacing: 1px; } + + +/* Tag Cloud +-----------------------------------------------------------------*/ + + +.tagcloud { margin-bottom: -2px; } + +.tagcloud a { + display: block; + float: left; + margin-right: 4px; + margin-bottom: 4px; + padding: 3px 6px; + border: 1px solid #E5E5E5; + font-size: 13px !important; + color: #666; + border-radius: 2px; +} + +body:not(.device-touch) .tagcloud a { + -webkit-transition: all .3s ease-in-out; + -o-transition: all .3s ease-in-out; + transition: all .3s ease-in-out; +} + +.tagcloud a:hover { + border-color: #1ABC9C !important; + color: #1ABC9C !important; +} + + +/* Widget - Links +-----------------------------------------------------------------*/ + +.widget_nav_menu ul, +.widget_nav_menu li, +.widget_links ul, +.widget_links li, +.widget_meta ul, +.widget_meta li, +.widget_archive ul, +.widget_archive li, +.widget_recent_comments ul, +.widget_recent_comments li, +.widget_recent_entries ul, +.widget_recent_entries li, +.widget_categories ul, +.widget_categories li, +.widget_pages ul, +.widget_pages li, +.widget_rss ul, +.widget_rss li { + list-style: none; + margin: 0; +} + +.widget_nav_menu li, +.widget_links li, +.widget_meta li, +.widget_archive li, +.widget_recent_comments li, +.widget_recent_entries li, +.widget_categories li, +.widget_pages li, +.widget_rss li { + display: flex; + padding: 4px 0; + font-size: 15px; +} + +.widget_nav_menu:not(.widget-li-noicon) li::before, +.widget_links:not(.widget-li-noicon) li::before, +.widget_meta:not(.widget-li-noicon) li::before, +.widget_archive:not(.widget-li-noicon) li::before, +.widget_recent_entries:not(.widget-li-noicon) li::before, +.widget_categories:not(.widget-li-noicon) li::before, +.widget_pages:not(.widget-li-noicon) li::before, +.widget_rss:not(.widget-li-noicon) li::before, +.widget_recent_comments:not(.widget-li-noicon) li::before { + content: "\e7a5"; + font-family: 'font-icons'; + display: inline-block; + position: relative; + top: 1px; + left: 0; +} + +.widget_recent_comments li::before { + content: "\e9b8"; +} + +.widget_nav_menu li a, +.widget_links li a, +.widget_meta li a, +.widget_archive li a, +.widget_recent_entries li a, +.widget_categories li a, +.widget_pages li a, +.widget_rss li a, +.widget_recent_comments li a { + display: inline-block; + padding: 0 3px 0 12px; + border: none !important; + color: #444; +} + +.widget_nav_menu.widget-li-noicon li a, +.widget_links.widget-li-noicon li a, +.widget_meta.widget-li-noicon li a, +.widget_archive.widget-li-noicon li a, +.widget_recent_entries.widget-li-noicon li a, +.widget_categories.widget-li-noicon li a, +.widget_pages.widget-li-noicon li a, +.widget_rss.widget-li-noicon li a, +.widget_recent_comments.widget-li-noicon li a { + padding-left: 0; +} + +.widget_nav_menu li a:hover, +.widget_links li a:hover, +.widget_meta li a:hover, +.widget_archive li a:hover, +.widget_recent_entries li a:hover, +.widget_categories li a:hover, +.widget_pages li a:hover, +.widget_rss li a:hover, +.widget_recent_comments li a:hover { color: #000; } + +.widget_nav_menu > ul > li:first-child, +.widget_links > ul > li:first-child, +.widget_meta > ul > li:first-child, +.widget_archive > ul > li:first-child, +.widget_recent_comments > ul > li:first-child, +.widget_recent_entries > ul > li:first-child, +.widget_categories > ul > li:first-child, +.widget_pages > ul > li:first-child, +.widget_rss > ul > li:first-child { border-top: 0 !important; } + +.widget_nav_menu > ul, +.widget_links > ul, +.widget_meta > ul, +.widget_archive > ul, +.widget_recent_comments > ul, +.widget_recent_entries > ul, +.widget_categories > ul, +.widget_pages > ul, +.widget_rss > ul { margin-top: -4px !important; } + +.widget_nav_menu ul ul, +.widget_links ul ul, +.widget_meta ul ul, +.widget_archive ul ul, +.widget_recent_comments ul ul, +.widget_recent_entries ul ul, +.widget_categories ul ul, +.widget_pages ul ul, +.widget_rss ul ul { margin-left: 15px; } + + +/* Widget - Testimonial & Twitter +-----------------------------------------------------------------*/ + +.widget .testimonial.no-image .testi-image { display: none; } + +.widget .testimonial.twitter-scroll .testi-image { margin-right: 10px; } + +.widget .testimonial:not(.twitter-scroll) .testi-image, +.widget .testimonial:not(.twitter-scroll) .testi-image a, +.widget .testimonial:not(.twitter-scroll) .testi-image img { + width: 42px; + height: 42px; +} + +.widget .testimonial.twitter-scroll .testi-image, +.widget .testimonial.twitter-scroll .testi-image a, +.widget .testimonial.twitter-scroll .testi-image img, +.widget .testimonial.twitter-scroll .testi-image i { + width: 28px; + height: 28px; +} + +.widget .testimonial.twitter-scroll .testi-image i { + background-color: #EEE; + line-height: 28px; + font-size: 0.875rem; + color: #888; +} + +.widget .testimonial p { font-size: 0.875rem; } + + +/* Widget - Quick Contact Form +-----------------------------------------------------------------*/ + +.quick-contact-widget.form-widget .form-control, +.quick-contact-widget.form-widget .input-group, +.quick-contact-widget.form-widget .sm-form-control { margin-bottom: 10px; } + +.quick-contact-widget.form-widget .input-group .form-control { margin-bottom: 0; } + +.quick-contact-widget.form-widget form, +#template-contactform { position: relative; } + + +/* Newsletter Widget +-----------------------------------------------------------------*/ + +.subscribe-widget h5 { + font-weight: 300; + font-size: 0.875rem; + line-height: 1.5; +} + + +/* Twitter Feed Widget +-----------------------------------------------------------------*/ + +.widget-twitter-feed li { margin: 15px 0 0 0; } + +.widget-twitter-feed li:first-child { margin-top: 0; } + +.widget-twitter-feed small { + display: block; + margin-top: 3px; +} + +.widget-twitter-feed small a:not(:hover) { color: #999; } + +.widget-twitter-feed .twitter-feed:not(.twitter-feed-avatar) a.twitter-avatar { display: none; } + +.widget-twitter-feed .twitter-feed.twitter-feed-avatar i.icon-twitter { display: none; } + +.widget-twitter-feed .twitter-feed-avatar { margin-left: 44px; } + +.widget-twitter-feed .twitter-feed-avatar > li a.twitter-avatar { + display: block; + position: absolute; + left: -44px; + text-align: center; + top: 2px; + width: 32px; + height: 32px; +} + +.twitter-feed-avatar a.twitter-avatar img { border-radius: 50%; } + + +/* Widget Filter Links +-----------------------------------------------------------------*/ + +.widget-filter-links ul { + list-style: none; + margin-bottom: 0; +} + +.widget-filter-links .widget-filter-reset { + position: absolute; + top: 0; + left: auto; + right: 0; + font-size: 12px; + line-height: 22px; +} + +.widget:not(:first-child) .widget-filter-reset { top: 50px; } + +.widget-filter-links .widget-filter-reset a { color: red !important; } + +.widget-filter-links .widget-filter-reset.active-filter { display: none; } + +.widget-filter-links li { + position: relative; + font-size: 15px; + line-height: 24px; +} + +.widget-filter-links li:not(:first-child) { margin-top: 10px; } + +.widget-filter-links li a { + display: block; + color: #444; + font-family: 'Poppins', sans-serif; + font-weight: 500; +} + +.widget-filter-links li span { + position: absolute; + top: 1px; + left: auto; + right: 0; + font-size: 11px; + width: 22px; + height: 22px; + line-height: 22px; + text-align: center; + color: #777; + background-color: #EEE; + border-radius: 50%; +} + +.widget-filter-links li:hover a { color: #777; } + +.widget-filter-links li.active-filter a { font-weight: 700; } + +.widget-filter-links li.active-filter span { + color: #FFF !important; + background-color: #1ABC9C !important; + text-shadow: 1px 1px 1px rgba(0,0,0,0.1); +} + + +/* Navigation Tree +-----------------------------------------------------------------*/ + +.nav-tree { + position: relative; + margin-bottom: 40px; +} + +.nav-tree ul { + margin-bottom: 0; + list-style: none; +} + +.nav-tree > ul { margin: -8px 0; } + +.nav-tree li { position: relative; } + +.nav-tree li a { + display: block; + padding: 8px 0; + color: #333; + text-transform: uppercase; + font-size: 13px; + font-weight: 700; + letter-spacing: 2px; + font-family: 'Poppins', sans-serif; +} + +.nav-tree li i { + font-size: 0.875rem; + width: 16px; + text-align: center; +} + +.nav-tree li i:not(.icon-angle-down) { + margin-right: 8px; + position: relative; + top: 1px; +} + +.nav-tree li a i.icon-angle-down { + width: auto; + font-size: 12px; + margin-left: 2px; +} + +.nav-tree li:hover > a, +.nav-tree li.current > a, +.nav-tree li.active > a { color: #1ABC9C !important; } + +.nav-tree ul ul { display: none; } + +.nav-tree li.current > ul { display: block; } + +.nav-tree ul ul a { + font-size: 12px; + padding: 6px 0; + letter-spacing: 1px; + font-family: 'Lato', sans-serif; +} + +.nav-tree ul ul a i.icon-angle-down { font-size: 12px; } + +.nav-tree ul ul a { padding-left: 20px; } +.nav-tree ul ul ul a { padding-left: 40px; } +.nav-tree ul ul ul ul a { padding-left: 60px; } +.nav-tree ul ul ul ul ul a { padding-left: 80px; } + + +/* ---------------------------------------------------------------- + Wedding +-----------------------------------------------------------------*/ + + +.wedding-head { + position: relative; + line-height: 1; + font-size: 80px; + text-shadow: 1px 1px 1px rgba(0,0,0,0.15); + font-family: 'Poppins', sans-serif; +} + +.wedding-head .first-name, +.wedding-head .last-name, +.wedding-head .and { + display: inline-block; + margin-right: 15px; + font-weight: bold; + text-align: right; + text-transform: uppercase; + letter-spacing: 2px; +} + +.wedding-head .last-name { + margin: 0 0 0 15px; + text-align: left; +} + +.wedding-head .first-name span, +.wedding-head .last-name span { + display: block; + margin-top: 10px; + font-size: 56px; + font-weight: 400; + font-style: italic; + font-family: 'PT Serif', serif; + text-transform: none; +} + +.wedding-head .and { + margin: 0; + font-size: 200px; + font-family: 'Times New Roman', serif; +} + + +/* ---------------------------------------------------------------- + Styled Paginations +-----------------------------------------------------------------*/ + + +.pagination.pagination-circle .page-item .page-link { + width: 35px; + height: 35px; + line-height: 33px; + text-align: center; + padding: 0; + border-radius: 50%; +} + +.pagination.pagination-circle.pagination-lg .page-item .page-link { + width: 56px; + height: 56px; + line-height: 54px; +} + +.pagination.pagination-circle.pagination-sm .page-item .page-link { + width: 26px; + height: 26px; + line-height: 24px; +} + +/* Pagination Rounded */ +.pagination.pagination-rounded .page-item .page-link { border-radius: 4px; } + +/* Pagination Margins */ +.pagination.pagination-circle .page-item:not(:first-child) .page-link, +.pagination.pagination-rounded .page-item:not(:first-child) .page-link { margin-left: 5px; } + +.pagination.pagination-circle.pagination-lg .page-item:not(:first-child) .page-link, +.pagination.pagination-rounded.pagination-lg .page-item:not(:first-child) .page-link { margin-left: 8px; } + +.pagination.pagination-circle.pagination-sm .page-item:not(:first-child) .page-link, +.pagination.pagination-rounded.pagination-sm .page-item:not(:first-child) .page-link { margin-left: 3px; } + +/* Pagination 3d */ +.pagination.pagination-3d .page-item .page-link { border-bottom: 3px solid rgba(0,0,0,0.15) !important; } + +/* Pagination Transparent */ +.pagination.pagination-transparent .page-item .page-link { border: 0; } + +/* Pagination Transparent */ +.pagination.pagination-inside-transparent .page-item .page-link:not(:hover) { color: #222; } + +/* Pagination Inside Transparent */ +.pagination.pagination-inside-transparent .page-item:not(:first-child):not(:nth-child(2)):not(:nth-last-child(1)) .page-link { border-left: 0; } + +.pagination.pagination-inside-transparent .page-item.active .page-link, +.pagination.pagination-inside-transparent .page-link:hover, +.pagination.pagination-inside-transparent .page-link:focus { border-color: transparent !important; } + +/* Pagination Button */ +.pagination.pagination-inside-transparent.pagination-button .page-item:not(:first-child):not(:nth-last-child(1)) .page-link { border: 0; } + +/* Pagination Pill */ +.pagination.pagination-pill .page-item:first-child .page-link { + border-top-left-radius: 10rem; + border-bottom-left-radius: 10rem; +} + +.pagination.pagination-pill .page-item:last-child .page-link { + border-top-right-radius: 10rem; + border-bottom-right-radius: 10rem; +} + +/* Pagination primary */ +.pagination.pagination-primary .page-item .page-link { + background-color: #007bff; + background-color: var(--primary); + border-color: #007bff; + border-color: var(--primary); + color: #FFF; +} + +/* Pagination secondary */ +.pagination.pagination-secondary .page-item .page-link { + background-color: #6c757d; + background-color: var(--secondary); + border-color: #6c757d; + border-color: var(--secondary); + color: #FFF; +} + +/* Pagination success */ +.pagination.pagination-success .page-item .page-link { + background-color: #28a745; + background-color: var(--success); + border-color: #28a745; + border-color: var(--success); + color: #FFF; +} + +/* Pagination danger */ +.pagination.pagination-danger .page-item .page-link { + background-color: #dc3545; + background-color: var(--danger); + border-color: #dc3545; + border-color: var(--danger); + color: #FFF; +} + +/* Pagination info */ +.pagination.pagination-info .page-item .page-link { + background-color: #17a2b8; + background-color: var(--info); + border-color: #17a2b8; + border-color: var(--info); + color: #FFF; +} + +/* Pagination dark */ +.pagination.pagination-dark .page-item .page-link { + background-color: #343a40; + background-color: var(--dark); + border-color: #343a40; + border-color: var(--dark); + color: #FFF; +} + +/* Pagination light */ +.pagination.pagination-light .page-item .page-link { + background-color: #f8f9fa; + background-color: var(--light); + border-color: #f8f9fa; + border-color: var(--light); + color: #222; +} + +/* Pagination Bootstrap Background */ +.pagination.pagination-primary .page-item.active .page-link, +.pagination.pagination-primary .page-link:hover, +.pagination.pagination-primary .page-link:focus, +.pagination.pagination-secondary .page-item.active .page-link, +.pagination.pagination-secondary .page-link:hover, +.pagination.pagination-secondary .page-link:focus, +.pagination.pagination-success .page-item.active .page-link, +.pagination.pagination-success .page-link:hover, +.pagination.pagination-success .page-link:focus, +.pagination.pagination-danger .page-item.active .page-link, +.pagination.pagination-danger .page-link:hover, +.pagination.pagination-danger .page-link:focus, +.pagination.pagination-info .page-item.active .page-link, +.pagination.pagination-info .page-link:hover, +.pagination.pagination-info .page-link:focus, +.pagination.pagination-light .page-item.active .page-link, +.pagination.pagination-light .page-link:hover, +.pagination.pagination-light .page-link:focus { + background-color: #222 !important; + border-color: #222 !important; + color: #FFF; +} + + +/* -------------------------------------------------------------- + SWITCH +-------------------------------------------------------------- */ + +.switch-toggle { + position: absolute; + margin-left: -9999px; + visibility: hidden; +} + +.switch-toggle + label { + display: block; + position: relative; + cursor: pointer; + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* -------------------------------------------------------------- + SWITCH 1 - ROUND +----------------------------------------------------------------- */ +input.switch-toggle-round + label { + padding: 2px; + width: 60px; + height: 30px; + background-color: #DDD; + -webkit-border-radius: 15px; + -o-border-radius: 15px; + border-radius: 15px; +} + +input.switch-toggle-round + label::before, +input.switch-toggle-round + label::after { + display: block; + position: absolute; + top: 1px; + left: 1px; + bottom: 1px; + content: ""; +} + +input.switch-toggle-round + label::before { + right: 1px; + background-color: #F1F1F1; + -webkit-border-radius: 15px; + -o-border-radius: 15px; + border-radius: 15px; + -webkit-transition: background 0.4s; + -moz-transition: background 0.4s; + -o-transition: background 0.4s; + transition: background 0.4s; +} + +input.switch-toggle-round + label::after { + width: 28px; + background-color: #FFF; + -webkit-border-radius: 100%; + -o-border-radius: 100%; + border-radius: 100%; + -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); + -webkit-transition: margin 0.4s; + -moz-transition: margin 0.4s; + -o-transition: margin 0.4s; + transition: margin 0.4s; +} + +input.switch-toggle-round:checked + label::before { background-color: #1ABC9C; } +input.switch-toggle-round:checked + label::after { margin-left: 30px; } + +/* -------------------------------------------------------------- + SWITCH 1 - ROUND- MINI +----------------------------------------------------------------- */ +input.switch-rounded-mini.switch-toggle-round + label { + padding: 1px; + width: 32px; + height: 16px; + -webkit-border-radius: 8px; + -o-border-radius: 8px; + border-radius: 8px; +} + +input.switch-rounded-mini.switch-toggle-round + label::before { + -webkit-border-radius: 8px; + -o-border-radius: 8px; + border-radius: 8px; +} + +input.switch-rounded-mini.switch-toggle-round + label::after { width: 15px; } +input.switch-rounded-mini.switch-toggle-round:checked + label::after { margin-left: 15px; } + +/* -------------------------------------------------------------- + SWITCH 1 - ROUND- LARGE +----------------------------------------------------------------- */ +input.switch-rounded-large.switch-toggle-round + label { + width: 90px; + height: 45px; + -webkit-border-radius: 45px; + -o-border-radius: 45px; + border-radius: 45px; +} + +input.switch-rounded-large.switch-toggle-round + label::before { + -webkit-border-radius: 45px; + -o-border-radius: 45px; + border-radius: 45px; +} + +input.switch-rounded-large.switch-toggle-round + label::after { width: 43px; } +input.switch-rounded-large.switch-toggle-round:checked + label::after { margin-left: 45px; } + + +/* -------------------------------------------------------------- + SWITCH 1 - ROUND- XLARGE +----------------------------------------------------------------- */ +input.switch-rounded-xlarge.switch-toggle-round + label { + width: 120px; + height: 60px; + -webkit-border-radius: 60px; + -o-border-radius: 60px; + border-radius: 60px; +} + +input.switch-rounded-xlarge.switch-toggle-round + label::before { + -webkit-border-radius: 60px; + -o-border-radius: 60px; + border-radius: 60px; +} + +input.switch-rounded-xlarge.switch-toggle-round + label::after { width: 58px; } +input.switch-rounded-xlarge.switch-toggle-round:checked + label::after { margin-left: 60px; } + + +/* ----------------------------------------------------------- + SWITCH 2 - ROUND FLAT +-------------------------------------------------------------- */ +input.switch-toggle-flat + label { + padding: 2px; + width: 60px; + height: 30px; + background-color: #DDD; + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + -ms-border-radius: 30px; + -o-border-radius: 30px; + border-radius: 30px; + -webkit-transition: background 0.4s; + -moz-transition: background 0.4s; + -o-transition: background 0.4s; + transition: background 0.4s; +} + +input.switch-toggle-flat + label::before, +input.switch-toggle-flat + label::after { + display: block; + position: absolute; + content: ""; +} + +input.switch-toggle-flat + label::before { + top: 2px; + left: 2px; + bottom: 2px; + right: 2px; + background-color: #FFF; + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + -ms-border-radius: 30px; + -o-border-radius: 30px; + border-radius: 30px; + -webkit-transition: background 0.4s; + -moz-transition: background 0.4s; + -o-transition: background 0.4s; + transition: background 0.4s; +} + +input.switch-toggle-flat + label::after { + top: 4px; + left: 4px; + bottom: 4px; + width: 22px; + background-color: #DDD; + -webkit-border-radius: 22px; + -moz-border-radius: 22px; + -ms-border-radius: 22px; + -o-border-radius: 22px; + border-radius: 22px; + -webkit-transition: margin 0.4s, background 0.4s; + -moz-transition: margin 0.4s, background 0.4s; + -o-transition: margin 0.4s, background 0.4s; + transition: margin 0.4s, background 0.4s; +} + +input.switch-toggle-flat:checked + label { background-color: #1ABC9C; } + +input.switch-toggle-flat:checked + label::after { + margin-left: 30px; + background-color: #1ABC9C; +} + + +/* ----------------------------------------------------------- + SWITCH 2 - FLAT - MINI +-------------------------------------------------------------- */ +input.switch-flat-mini.switch-toggle-flat + label { + padding: 1px; + width: 32px; + height: 16px; + -webkit-border-radius: 16px; + -o-border-radius: 16px; + border-radius: 16px; +} + +input.switch-flat-mini.switch-toggle-flat + label::before { + top: 1px; + left: 1px; + bottom: 1px; + right: 1px; + -webkit-border-radius: 16px; + -o-border-radius: 16px; + border-radius: 16px; +} + +input.switch-flat-mini.switch-toggle-flat + label::after { + top: 2px; + left: 2px; + bottom: 2px; + width: 12px; + -webkit-border-radius: 12px; + -o-border-radius: 12px; + border-radius: 12px; +} + +input.switch-flat-mini.switch-toggle-flat:checked + label::after { margin-left: 16px; } + + +/* ----------------------------------------------------------- + SWITCH 2 - FLAT - LARGE +-------------------------------------------------------------- */ +input.switch-flat-large.switch-toggle-flat + label { + width: 90px; + height: 45px; + -webkit-border-radius: 45px; + -o-border-radius: 45px; + border-radius: 45px; +} + +input.switch-flat-large.switch-toggle-flat + label::before { + -webkit-border-radius: 45px; + -o-border-radius: 45px; + border-radius: 45px; +} + +input.switch-flat-large.switch-toggle-flat + label::after { + width: 37px; + -webkit-border-radius: 37px; + -o-border-radius: 37px; + border-radius: 37px; +} + +input.switch-flat-large.switch-toggle-flat:checked + label::after { margin-left: 45px; } + + + +/* ----------------------------------------------------------- + SWITCH 2 - FLAT - XLARGE +-------------------------------------------------------------- */ +input.switch-flat-xlarge.switch-toggle-flat + label { + padding: 2px; + width: 120px; + height: 60px; + -webkit-border-radius: 60px; + -o-border-radius: 60px; + border-radius: 60px; +} + +input.switch-flat-xlarge.switch-toggle-flat + label::before { + -webkit-border-radius: 60px; + -o-border-radius: 60px; + border-radius: 60px; +} +input.switch-flat-xlarge.switch-toggle-flat + label::after { + width: 52px; + -webkit-border-radius: 52px; + -o-border-radius: 52px; + border-radius: 52px; +} + +input.switch-flat-xlarge.switch-toggle-flat:checked + label::after { margin-left: 60px; } + + +.show-error-msg .switch + label.error { + display: block !important; +} + +.switch input[type="checkbox"].error + label { + border: 1px solid red; +} + + +/* ---------------------------------------------------------------- + Bootstrap Specific +-----------------------------------------------------------------*/ + +.table .success { color: #3c763d; } + +.table .info { color: #31708f; } + +.table .warning { color: #8a6d3b; } + +.table .danger { color: #a94442; } + +.btn-link, +.page-link, +.page-link:hover, +.page-link:focus { color: #1ABC9C; } + +.btn-link:hover, +.btn-link:focus { color: #222; } + +.boot-tabs { margin-bottom: 20px !important; } + +.carousel-control .icon-chevron-left, +.carousel-control .icon-chevron-right { + position: absolute; + top: 47.5%; + z-index: 5; + display: inline-block; +} + +.carousel-control .icon-chevron-left { left: 50%; } + +.carousel-control .icon-chevron-right { right: 50%; } + +.responsive-utilities th small { + display: block; + font-weight: 400; + color: #999; +} + +.show-grid [class^=col-] { + padding-top: 10px; + padding-bottom: 10px; + background-color: #EEE; + border: 1px solid #DDD; +} + +.img-circle { border-radius: 50% !important; } + +.page-item.active .page-link, +.page-link:hover, +.page-link:focus { + color: #FFF !important; + background-color: #1ABC9C !important; + border-color: #1ABC9C !important; +} + +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { background-color: #1ABC9C; } + +label.radio, +label.checkbox { padding-left: 20px; } + +.input-group-lg > .input-group-addon { line-height: 1; } + + +/* ---------------------------------------------------------------- + Stretched Layout +-----------------------------------------------------------------*/ + + +.stretched #wrapper { + width: 100%; + margin: 0; + box-shadow: none; +} + + +/* ---------------------------------------------------------------- + Shape Dividers +-----------------------------------------------------------------*/ + + +.shape-divider { + position: absolute; + top: -1px; + left: 0; + width: 100%; + overflow: hidden; + z-index: 1; +} + +.shape-divider[data-position="bottom"] { + top: auto; + bottom: -1px; +} + +.shape-divider[data-front="true"] { + z-index: 4; +} + +.shape-divider svg { + position: relative; + width: 100%; + width: calc( 100% + 1.3px ); + height: 50px; + left: 50%; + transform: translateX(-50%); + opacity: 0; +} + +.shape-divider[data-position="bottom"], +.shape-divider[data-flip-vertical="true"] { + transform: rotate(180deg); +} + +.shape-divider[data-position="bottom"][data-flip-vertical="true"] { + transform: rotate(0deg); +} + +.shape-divider[data-flip="true"] svg { + transform: translateX(-50%) rotateY(180deg); +} + +.shape-divider-fill { + fill: #FFF; + transform-origin: center; + transform: rotateY(0deg); +} + + +/* ---------------------------------------------------------------- + Page Transitions +-----------------------------------------------------------------*/ + +.page-transition #wrapper, +.animsition-overlay { + position: relative; + opacity: 0; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.page-transition-wrap, +.css3-spinner { + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1000; + text-align: center; + background-color: #FFF; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-perspective: 1000; +} + +.css3-spinner { + position: absolute; + z-index: auto; + background-color: transparent; +} + +.css3-spinner > div { + position: absolute; + top: 50%; + left: 50%; + margin-top: -9px; + margin-left: 13px; + width: 18px; + height: 18px; + background-color: #DDD; + border-radius: 100%; + display: inline-block; + -webkit-animation: bouncedelay 1.4s infinite ease-in-out; + animation: bouncedelay 1.4s infinite ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.css3-spinner .css3-spinner-bounce1 { + margin-left: -31px; + -webkit-animation-delay: -0.32s; + animation-delay: -0.32s; +} + +.css3-spinner .css3-spinner-bounce2 { + margin-left: -9px; + -webkit-animation-delay: -0.16s; + animation-delay: -0.16s; +} + +@-webkit-keyframes bouncedelay { + 0%, 80%, 100% { -webkit-transform: scale(0.0) } + 40% { -webkit-transform: scale(1.0) } +} + +@keyframes bouncedelay { + 0%, 80%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 40% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} + + +.css3-spinner > .css3-spinner-flipper { + width: 32px; + height: 32px; + margin-top: -16px; + margin-left: -16px; + border-radius: 0; + -webkit-animation: rotateplane 1.2s infinite ease-in-out; + animation: rotateplane 1.2s infinite ease-in-out; +} + +@-webkit-keyframes rotateplane { + 0% { -webkit-transform: perspective(120px) } + 50% { -webkit-transform: perspective(120px) rotateY(180deg) } + 100% { -webkit-transform: perspective(120px) rotateY(180deg) rotateX(180deg) } +} + +@keyframes rotateplane { + 0% { + transform: perspective(120px) rotateX(0deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg) + } 50% { + transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg) + } 100% { + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + } +} + +.css3-spinner > .css3-spinner-double-bounce1, +.css3-spinner > .css3-spinner-double-bounce2 { + width: 40px; + height: 40px; + margin-top: -20px; + margin-left: -20px; + border-radius: 50%; + opacity: 0.6; + -webkit-animation: cssspinnerbounce 2.0s infinite ease-in-out; + animation: cssspinnerbounce 2.0s infinite ease-in-out; +} + +.css3-spinner > .css3-spinner-double-bounce2 { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; +} + +@-webkit-keyframes cssspinnerbounce { + 0%, 100% { -webkit-transform: scale(0.0) } + 50% { -webkit-transform: scale(1.0) } +} + +@keyframes cssspinnerbounce { + 0%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 50% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} + +.css3-spinner > .css3-spinner-rect1, +.css3-spinner > .css3-spinner-rect2, +.css3-spinner > .css3-spinner-rect3, +.css3-spinner > .css3-spinner-rect4, +.css3-spinner > .css3-spinner-rect5 { + height: 30px; + width: 6px; + margin-top: -15px; + margin-left: -21px; + border-radius: 0; + -webkit-animation: stretchdelay 1.2s infinite ease-in-out; + animation: stretchdelay 1.2s infinite ease-in-out; +} + +.css3-spinner > .css3-spinner-rect2 { + margin-left: -12px; + -webkit-animation-delay: -1.1s; + animation-delay: -1.1s; +} + +.css3-spinner > .css3-spinner-rect3 { + margin-left: -3px; + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; +} + +.css3-spinner > .css3-spinner-rect4 { + margin-left: 6px; + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +.css3-spinner > .css3-spinner-rect5 { + margin-left: 15px; + -webkit-animation-delay: -0.8s; + animation-delay: -0.8s; +} + +@-webkit-keyframes stretchdelay { + 0%, 40%, 100% { -webkit-transform: scaleY(0.4) } + 20% { -webkit-transform: scaleY(1.0) } +} + +@keyframes stretchdelay { + 0%, 40%, 100% { + transform: scaleY(0.4); + -webkit-transform: scaleY(0.4); + } 20% { + transform: scaleY(1.0); + -webkit-transform: scaleY(1.0); + } +} + + +.css3-spinner > .css3-spinner-cube1, +.css3-spinner > .css3-spinner-cube2 { + width: 16px; + height: 16px; + border-radius: 0; + margin-top: -20px; + margin-left: -20px; + -webkit-animation: cubemove 1.8s infinite ease-in-out; + animation: cubemove 1.8s infinite ease-in-out; +} + +.css3-spinner > .css3-spinner-cube2 { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +@-webkit-keyframes cubemove { + 25% { -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5) } + 50% { -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg) } + 75% { -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5) } + 100% { -webkit-transform: rotate(-360deg) } +} + +@keyframes cubemove { + 25% { + transform: translateX(42px) rotate(-90deg) scale(0.5); + -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5); + } 50% { + transform: translateX(42px) translateY(42px) rotate(-179deg); + -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg); + } 50.1% { + transform: translateX(42px) translateY(42px) rotate(-180deg); + -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg); + } 75% { + transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); + -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); + } 100% { + transform: rotate(-360deg); + -webkit-transform: rotate(-360deg); + } +} + + +.css3-spinner > .css3-spinner-scaler { + width: 40px; + height: 40px; + margin-top: -20px; + margin-left: -20px; + -webkit-animation: scaleout 1.0s infinite ease-in-out; + animation: scaleout 1.0s infinite ease-in-out; +} + +@-webkit-keyframes scaleout { + 0% { -webkit-transform: scale(0.0) } + 100% { + -webkit-transform: scale(1.0); + opacity: 0; + } +} + +@keyframes scaleout { + 0% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 100% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + opacity: 0; + } +} + + +.css3-spinner > .css3-spinner-grid-pulse { + display: -ms-flex; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + width: 48px; + height: 48px; + margin-top: -24px; + margin-left: -24px; + background-color: transparent !important; + -webkit-animation: none; + animation: none; +} + +.css3-spinner-grid-pulse > div { + background-color: #DDD; + width: 12px; + height: 12px; + max-width: 12px; + border-radius: 100%; + margin: 2px; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + display: inline-block; + -webkit-animation-name: ball-grid-pulse; + animation-name: ball-grid-pulse; + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-animation-delay: 0; + animation-delay: 0; +} + +.css3-spinner-grid-pulse > div:nth-child(1) { + -webkit-animation-delay: 0.73s; + animation-delay: 0.73s; + -webkit-animation-duration: 1.3s; + animation-duration: 1.3s; +} + +.css3-spinner-grid-pulse > div:nth-child(2) { + -webkit-animation-delay: 0.32s; + animation-delay: 0.32s; + -webkit-animation-duration: 1.3s; + animation-duration: 1.3s; +} + +.css3-spinner-grid-pulse > div:nth-child(3) { + -webkit-animation-delay: 0.71s; + animation-delay: 0.71s; + -webkit-animation-duration: 0.88s; + animation-duration: 0.88s; +} + +.css3-spinner-grid-pulse > div:nth-child(4) { + -webkit-animation-delay: 0.62s; + animation-delay: 0.62s; + -webkit-animation-duration: 1.06s; + animation-duration: 1.06s; +} + +.css3-spinner-grid-pulse > div:nth-child(5) { + -webkit-animation-delay: 0.31s; + animation-delay: 0.31s; + -webkit-animation-duration: 0.62s; + animation-duration: 0.62s; +} + +.css3-spinner-grid-pulse > div:nth-child(6) { + -webkit-animation-delay: -0.14s; + animation-delay: -0.14s; + -webkit-animation-duration: 1.48s; + animation-duration: 1.48s; +} + +.css3-spinner-grid-pulse > div:nth-child(7) { + -webkit-animation-delay: -0.1s; + animation-delay: -0.1s; + -webkit-animation-duration: 1.47s; + animation-duration: 1.47s; +} + +.css3-spinner-grid-pulse > div:nth-child(8) { + -webkit-animation-delay: 0.4s; + animation-delay: 0.4s; + -webkit-animation-duration: 1.49s; + animation-duration: 1.49s; +} + +.css3-spinner-grid-pulse > div:nth-child(9) { + -webkit-animation-delay: 0.73s; + animation-delay: 0.73s; + -webkit-animation-duration: 0.7s; + animation-duration: 0.7s; +} + +@-webkit-keyframes ball-grid-pulse { + 0% { + -webkit-transform: scale(1); + transform: scale(1); } + + 50% { + -webkit-transform: scale(0.5); + transform: scale(0.5); + opacity: 0.7; } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; } +} + +@keyframes ball-grid-pulse { + 0% { + -webkit-transform: scale(1); + transform: scale(1); } + + 50% { + -webkit-transform: scale(0.5); + transform: scale(0.5); + opacity: 0.7; } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; } +} + + +.css3-spinner > .css3-spinner-clip-rotate { + width: 33px; + height: 33px; + margin-top: -17px; + margin-left: -17px; + background-color: transparent !important; + -webkit-animation: none; + animation: none; +} + +.css3-spinner-clip-rotate > div { + border-radius: 100%; + border: 2px solid #DDD; + border-bottom-color: transparent !important; + height: 33px; + width: 33px; + background: transparent !important; + -webkit-animation: rotate 1s 0s linear infinite; + animation: rotate 1s 0s linear infinite; +} + +@keyframes rotate { + 0% { + -webkit-transform: rotate(0deg) scale(1); + transform: rotate(0deg) scale(1); } + + 50% { + -webkit-transform: rotate(180deg) scale(0.6); + transform: rotate(180deg) scale(0.6); } + + 100% { + -webkit-transform: rotate(360deg) scale(1); + transform: rotate(360deg) scale(1); } +} + + +.css3-spinner > .css3-spinner-ball-rotate { + width: 12px; + height: 12px; + margin-top: -6px; + margin-left: -6px; + background-color: transparent !important; + -webkit-animation: ballrotate 1s 0s cubic-bezier(.7, -.13, .22, .86) infinite; + animation: ballrotate 1s 0s cubic-bezier(.7, -.13, .22, .86) infinite; +} + +.css3-spinner-ball-rotate > div { + background-color: #DDD; + width: 12px; + height: 12px; + border-radius: 100%; + position: relative; +} + +.css3-spinner-ball-rotate > div:nth-child(1), .css3-spinner-ball-rotate > div:nth-child(3) { + width: 12px; + height: 12px; + border-radius: 100%; + content: ""; + position: absolute; + opacity: 0.7; +} + +.css3-spinner-ball-rotate > div:nth-child(1) { + top: 0px; + left: -22px; +} + +.css3-spinner-ball-rotate > div:nth-child(3) { + top: 0px; + left: 22px; +} + + +@-webkit-keyframes ballrotate { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + + 50% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } +} + +@keyframes ballrotate { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); } + + 50% { + -webkit-transform: rotate(180deg); + transform: rotate(180deg); } + + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); } +} + + +.css3-spinner > .css3-spinner-zig-zag { + background-color: transparent !important; + -webkit-transform: translate(-15px, -15px); + -ms-transform: translate(-15px, -15px); + transform: translate(-15px, -15px); + -webkit-animation: none; + animation: none; +} + +.css3-spinner-zig-zag > div { + background-color: #DDD; + width: 12px; + height: 12px; + border-radius: 100%; + position: absolute; + margin-left: 15px; + top: 4px; + left: -7px; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.css3-spinner-zig-zag > div:first-child { + -webkit-animation: ball-zig-deflect 1.5s 0s infinite linear; + animation: ball-zig-deflect 1.5s 0s infinite linear; +} + +.css3-spinner-zig-zag > div:last-child { + -webkit-animation: ball-zag-deflect 1.5s 0s infinite linear; + animation: ball-zag-deflect 1.5s 0s infinite linear; +} + + +@-webkit-keyframes ball-zig-deflect { + 17% { + -webkit-transform: translate(-15px, -30px); + transform: translate(-15px, -30px); } + + 34% { + -webkit-transform: translate(15px, -30px); + transform: translate(15px, -30px); } + + 50% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } + + 67% { + -webkit-transform: translate(15px, -30px); + transform: translate(15px, -30px); } + + 84% { + -webkit-transform: translate(-15px, -30px); + transform: translate(-15px, -30px); } + + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } +} + +@keyframes ball-zig-deflect { + 17% { + -webkit-transform: translate(-15px, -30px); + transform: translate(-15px, -30px); } + + 34% { + -webkit-transform: translate(15px, -30px); + transform: translate(15px, -30px); } + + 50% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } + + 67% { + -webkit-transform: translate(15px, -30px); + transform: translate(15px, -30px); } + + 84% { + -webkit-transform: translate(-15px, -30px); + transform: translate(-15px, -30px); } + + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } +} + +@-webkit-keyframes ball-zag-deflect { + 17% { + -webkit-transform: translate(15px, 30px); + transform: translate(15px, 30px); } + + 34% { + -webkit-transform: translate(-15px, 30px); + transform: translate(-15px, 30px); } + + 50% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } + + 67% { + -webkit-transform: translate(-15px, 30px); + transform: translate(-15px, 30px); } + + 84% { + -webkit-transform: translate(15px, 30px); + transform: translate(15px, 30px); } + + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } +} + +@keyframes ball-zag-deflect { + 17% { + -webkit-transform: translate(15px, 30px); + transform: translate(15px, 30px); } + + 34% { + -webkit-transform: translate(-15px, 30px); + transform: translate(-15px, 30px); } + + 50% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } + + 67% { + -webkit-transform: translate(-15px, 30px); + transform: translate(-15px, 30px); } + + 84% { + -webkit-transform: translate(15px, 30px); + transform: translate(15px, 30px); } + + 100% { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); } +} + + +.css3-spinner > .css3-spinner-ball-scale-multiple { + width: 60px; + height: 60px; + margin-left: -30px; + margin-top: -30px; + background-color: transparent !important; + -webkit-animation: none; + animation: none; +} + +.css3-spinner-ball-scale-multiple > div { + background-color: #DDD; + border-radius: 100%; + position: absolute; + left: 0; + top: 0; + opacity: 0; + width: 60px; + height: 60px; + -webkit-animation: ball-scale-multiple 1.25s 0s linear infinite; + animation: ball-scale-multiple 1.25s 0s linear infinite; +} + +.css3-spinner-ball-scale-multiple > div:nth-child(2) { + -webkit-animation-delay: -0.4s; + animation-delay: -0.4s; +} + +.css3-spinner-ball-scale-multiple > div:nth-child(3) { + -webkit-animation-delay: -0.2s; + animation-delay: -0.2s; +} + +@-webkit-keyframes ball-scale-multiple { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + opacity: 0; } + + 5% { opacity: 1; } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0; } +} + +@keyframes ball-scale-multiple { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + opacity: 0; } + + 5% { opacity: 1; } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0; } +} + + +.css3-spinner > .css3-spinner-triangle-path { + background-color: transparent !important; + -webkit-transform: translate(-29.994px, -37.50938px); + -ms-transform: translate(-29.994px, -37.50938px); + transform: translate(-29.994px, -37.50938px); + -webkit-animation: none; + animation: none; +} + +.css3-spinner-triangle-path > div { + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + position: absolute; + width: 10px; + height: 10px; + border-radius: 100%; + background-color: #DDD; +} + +.css3-spinner-triangle-path > div:nth-child(1) { + -webkit-animation: ball-triangle-path-1 2s 0s ease-in-out infinite; + animation: ball-triangle-path-1 2s 0s ease-in-out infinite; +} + +.css3-spinner-triangle-path > div:nth-child(2) { + -webkit-animation: ball-triangle-path-2 2s 0s ease-in-out infinite; + animation: ball-triangle-path-2 2s 0s ease-in-out infinite; +} + +.css3-spinner-triangle-path > div:nth-child(3) { + -webkit-animation: ball-triangle-path-3 2s 0s ease-in-out infinite; + animation: ball-triangle-path-3 2s 0s ease-in-out infinite; +} + +.css3-spinner-triangle-path > div:nth-of-type(1) { top: 50px; } + +.css3-spinner-triangle-path > div:nth-of-type(2) { left: 25px; } + +.css3-spinner-triangle-path > div:nth-of-type(3) { + top: 50px; + left: 50px; +} + +@-webkit-keyframes ball-triangle-path-1 { + 33% { + -webkit-transform: translate(25px, -50px); + transform: translate(25px, -50px); } + + 66% { + -webkit-transform: translate(50px, 0px); + transform: translate(50px, 0px); } + + 100% { + -webkit-transform: translate(0px, 0px); + transform: translate(0px, 0px); } +} + +@keyframes ball-triangle-path-1 { + 33% { + -webkit-transform: translate(25px, -50px); + transform: translate(25px, -50px); } + + 66% { + -webkit-transform: translate(50px, 0px); + transform: translate(50px, 0px); } + + 100% { + -webkit-transform: translate(0px, 0px); + transform: translate(0px, 0px); } +} + +@-webkit-keyframes ball-triangle-path-2 { + 33% { + -webkit-transform: translate(25px, 50px); + transform: translate(25px, 50px); } + + 66% { + -webkit-transform: translate(-25px, 50px); + transform: translate(-25px, 50px); } + + 100% { + -webkit-transform: translate(0px, 0px); + transform: translate(0px, 0px); } +} + +@keyframes ball-triangle-path-2 { + 33% { + -webkit-transform: translate(25px, 50px); + transform: translate(25px, 50px); } + + 66% { + -webkit-transform: translate(-25px, 50px); + transform: translate(-25px, 50px); } + + 100% { + -webkit-transform: translate(0px, 0px); + transform: translate(0px, 0px); } +} + +@-webkit-keyframes ball-triangle-path-3 { + 33% { + -webkit-transform: translate(-50px, 0px); + transform: translate(-50px, 0px); } + + 66% { + -webkit-transform: translate(-25px, -50px); + transform: translate(-25px, -50px); } + + 100% { + -webkit-transform: translate(0px, 0px); + transform: translate(0px, 0px); } +} + +@keyframes ball-triangle-path-3 { + 33% { + -webkit-transform: translate(-50px, 0px); + transform: translate(-50px, 0px); } + + 66% { + -webkit-transform: translate(-25px, -50px); + transform: translate(-25px, -50px); } + + 100% { + -webkit-transform: translate(0px, 0px); + transform: translate(0px, 0px); } +} + + +.css3-spinner > .css3-spinner-ball-pulse-sync { + width: 70px; + height: 34px; + margin-left: -35px; + margin-top: -17px; + background-color: transparent !important; + -webkit-animation: none; + animation: none; +} + +.css3-spinner-ball-pulse-sync > div { + display: inline-block; + background-color: #DDD; + width: 14px; + height: 14px; + margin: 10px 3px 0; + border-radius: 100%; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.css3-spinner-ball-pulse-sync > div:nth-child(0) { + -webkit-animation: ball-pulse-sync 0.7s -0.21s infinite ease-in-out; + animation: ball-pulse-sync 0.7s -0.21s infinite ease-in-out; +} + +.css3-spinner-ball-pulse-sync > div:nth-child(1) { + -webkit-animation: ball-pulse-sync 0.7s -0.14s infinite ease-in-out; + animation: ball-pulse-sync 0.7s -0.14s infinite ease-in-out; +} + +.css3-spinner-ball-pulse-sync > div:nth-child(2) { + -webkit-animation: ball-pulse-sync 0.7s -0.07s infinite ease-in-out; + animation: ball-pulse-sync 0.7s -0.07s infinite ease-in-out; +} + +.css3-spinner-ball-pulse-sync > div:nth-child(3) { + -webkit-animation: ball-pulse-sync 0.7s 0s infinite ease-in-out; + animation: ball-pulse-sync 0.7s 0s infinite ease-in-out; +} + + +@-webkit-keyframes ball-pulse-sync { + 33% { + -webkit-transform: translateY(10px); + transform: translateY(10px); + opacity: 0.85; + } + + 66% { + -webkit-transform: translateY(-10px); + transform: translateY(-10px); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } +} + +@keyframes ball-pulse-sync { + 33% { + -webkit-transform: translateY(10px); + transform: translateY(10px); + opacity: 0.85; + } + + 66% { + -webkit-transform: translateY(-10px); + transform: translateY(-10px); + opacity: 0.7; + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + opacity: 1; + } +} + + +.css3-spinner > .css3-spinner-scale-ripple { + width: 50px; + height: 50px; + margin-left: -25px; + margin-top: -25px; + background-color: transparent !important; + -webkit-animation: none; + animation: none; +} + +.css3-spinner-scale-ripple > div { + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + position: absolute; + top: 0; + width: 50px; + height: 50px; + border-radius: 100%; + border: 2px solid #DDD; + -webkit-animation: ball-scale-ripple-multiple 1.4s 0s infinite cubic-bezier(.21, .53, .56, .8); + animation: ball-scale-ripple-multiple 1.4s 0s infinite cubic-bezier(.21, .53, .56, .8); +} + +.css3-spinner-scale-ripple > div:nth-child(0) { + -webkit-animation-delay: -0.8s; + animation-delay: -0.8s; +} + +.css3-spinner-scale-ripple > div:nth-child(1) { + -webkit-animation-delay: -0.6s; + animation-delay: -0.6s; +} + +.css3-spinner-scale-ripple > div:nth-child(2) { + -webkit-animation-delay: -0.4s; + animation-delay: -0.4s; +} + +.css3-spinner-scale-ripple > div:nth-child(3) { + -webkit-animation-delay: -0.2s; + animation-delay: -0.2s; +} + + +@-webkit-keyframes ball-scale-ripple-multiple { + 0% { + -webkit-transform: scale(0.1); + transform: scale(0.1); + opacity: 1; } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.7; } + + 100% { + opacity: 0.0; } +} + +@keyframes ball-scale-ripple-multiple { + 0% { + -webkit-transform: scale(0.1); + transform: scale(0.1); + opacity: 1; } + + 70% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.7; } + + 100% { + opacity: 0.0; } +} + + + +/* ---------------------------------------------------------------- + HTML5 Youtube Video Backgrounds +-----------------------------------------------------------------*/ + + +.mb_YTVPlayer:focus { outline: 0; } + +.mb_YTVPlayer { + display:block; + transform:translateZ(0); + transform-style: preserve-3d; + perspective: 1000; + backface-visibility: hidden; + transform:translate3d(0,0,0); + animation-timing-function: linear; +} + +.mb_YTVPlayer.fullscreen { + display:block!important; + position: fixed!important; + width: 100%!important; + height: 100%!important; + top: 0!important; + left: 0!important; + margin: 0!important; + border: none !important; +} + +.mb_YTVPlayer.fullscreen .mbYTP_wrapper { opacity:1 !important; } + + +.mbYTP_wrapper iframe { max-width: 4000px !important; } + +.inline_YTPlayer { + margin-bottom: 20px; + vertical-align:top; + position:relative; + left:0; + overflow: hidden; + border-radius: 4px; + -moz-box-shadow: 0 0 5px rgba(0,0,0,.7); + -webkit-box-shadow: 0 0 5px rgba(0,0,0,.7); + box-shadow: 0 0 5px rgba(0,0,0,.7); + background: rgba(0,0,0,.5); +} + +.inline_YTPlayer img { + border: none!important; + -moz-transform: none!important; + -webkit-transform: none!important; + -o-transform: none!important; + transform: none!important; + margin:0!important; + padding:0!important +} + +/* ---------------------------------------------------------------- + Datepicker Component +-----------------------------------------------------------------*/ + +.datepicker td, +.datepicker th { padding: 5px; } + +/* ---------------------------------------------------------------- + Star Ratings Component +-----------------------------------------------------------------*/ + +.rating-xl { font-size: 3rem !important; } + +.rating-lg { font-size: 2.5rem !important; } + +.rating-md { font-size: 2rem !important; } + +.rating-sm { font-size: 1.75rem !important; } + +.rating-xs { font-size: 1.25rem !important; } + +.rating-container .star { margin: 0 2px !important; } + +.rating-container .filled-stars { + -webkit-text-stroke: 0px !important; + text-shadow: none !important; +} + + +.irs-bar, +.irs-from, +.irs-to, +.irs-single, +.irs-handle > i:first-child, +.irs-handle.state_hover > i:first-child, +.irs-handle:hover > i:first-child { background-color: #1ABC9C !important; } + +.irs-from::before, +.irs-to::before, +.irs-single::before { border-top-color: #1ABC9C !important; } + + + + +/* ---------------------------------------------------------------- + Custom Animate.css Styles +-----------------------------------------------------------------*/ + +@-webkit-keyframes fadeInDownSmall { + from { + opacity: 0; + -webkit-transform: translate3d(0, -50%, 0); + transform: translate3d(0, -50%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInDownSmall { + from { + opacity: 0; + -webkit-transform: translate3d(0, -50%, 0); + transform: translate3d(0, -50%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInDownSmall { + -webkit-animation-name: fadeInDownSmall; + animation-name: fadeInDownSmall; +} + + +@-webkit-keyframes fadeInLeftSmall { + from { + opacity: 0; + -webkit-transform: translate3d(-50%, 0, 0); + transform: translate3d(-50%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInLeftSmall { + from { + opacity: 0; + -webkit-transform: translate3d(-50%, 0, 0); + transform: translate3d(-50%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInLeftSmall { + -webkit-animation-name: fadeInLeftSmall; + animation-name: fadeInLeftSmall; +} + + +@-webkit-keyframes fadeInRightSmall { + from { + opacity: 0; + -webkit-transform: translate3d(50%, 0, 0); + transform: translate3d(50%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInRightSmall { + from { + opacity: 0; + -webkit-transform: translate3d(50%, 0, 0); + transform: translate3d(50%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInRightSmall { + -webkit-animation-name: fadeInRightSmall; + animation-name: fadeInRightSmall; +} + + +@-webkit-keyframes fadeInUpSmall { + from { + opacity: 0; + -webkit-transform: translate3d(0, 50%, 0); + transform: translate3d(0, 50%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes fadeInUpSmall { + from { + opacity: 0; + -webkit-transform: translate3d(0, 50%, 0); + transform: translate3d(0, 50%, 0); + } + + to { + opacity: 1; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.fadeInUpSmall { + -webkit-animation-name: fadeInUpSmall; + animation-name: fadeInUpSmall; +} + + +@-webkit-keyframes fadeOutDownSmall { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 50%, 0); + transform: translate3d(0, 50%, 0); + } +} + +@keyframes fadeOutDownSmall { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 50%, 0); + transform: translate3d(0, 50%, 0); + } +} + +.fadeOutDownSmall { + -webkit-animation-name: fadeOutDownSmall; + animation-name: fadeOutDownSmall; +} + + +@-webkit-keyframes fadeOutLeftSmall { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-50%, 0, 0); + transform: translate3d(-50%, 0, 0); + } +} + +@keyframes fadeOutLeftSmall { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-50%, 0, 0); + transform: translate3d(-50%, 0, 0); + } +} + +.fadeOutLeftSmall { + -webkit-animation-name: fadeOutLeftSmall; + animation-name: fadeOutLeftSmall; +} + + +@-webkit-keyframes fadeOutRightSmall { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(50%, 0, 0); + transform: translate3d(50%, 0, 0); + } +} + +@keyframes fadeOutRightSmall { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(50%, 0, 0); + transform: translate3d(50%, 0, 0); + } +} + +.fadeOutRightSmall { + -webkit-animation-name: fadeOutRightSmall; + animation-name: fadeOutRightSmall; +} + + +@-webkit-keyframes fadeOutUpSmall { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -50%, 0); + transform: translate3d(0, -50%, 0); + } +} + +@keyframes fadeOutUpSmall { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -50%, 0); + transform: translate3d(0, -50%, 0); + } +} + +.fadeOutUpSmall { + -webkit-animation-name: fadeOutUpSmall; + animation-name: fadeOutUpSmall; +} + + diff --git a/fassets/style.scss b/fassets/style.scss new file mode 100644 index 0000000..aebb7e0 --- /dev/null +++ b/fassets/style.scss @@ -0,0 +1,65 @@ +/*----------------------------------------------------------------------------------- + + Theme Name: Canvas + Theme URI: http://themes.semicolonweb.com/html/canvas + Description: The Multi-Purpose Template + Author: SemiColonWeb + Author URI: http://themeforest.net/user/semicolonweb + Version: 6.5.2 + + SASS Stylesheet + +-----------------------------------------------------------------------------------*/ + +// Initialize +@import "sass/variables"; +@import "sass/mixins"; + +// Bootstrap +@import "sass/bootstrap/bootstrap"; + +// Core CSS +@import "sass/layouts"; +@import "sass/typography"; +@import "sass/utilities"; + + +// Content Blocks +@import "sass/topbar"; +@import "sass/header"; +@import "sass/sliders"; +@import "sass/pagetitle"; +@import "sass/content"; +@import "sass/portfolio"; +@import "sass/blog"; +@import "sass/shop"; +@import "sass/events"; + + +// Shortcodes +@import "sass/shortcodes"; + +// Forms +@import "sass/forms"; + +// Footer +@import "sass/footer"; + + +// Widgets +@import "sass/widgets"; + +// Paginations +@import "sass/paginations"; + +// Extras +@import "sass/extras"; + +// Page Loaders +@import "sass/page-loaders"; + +// RTL Template +@import "sass/style-rtl"; + +// Dark +@import "sass/dark"; \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..ca1304a --- /dev/null +++ b/index.php @@ -0,0 +1,315 @@ +=')) + { + error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED); + } + else + { + error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE); + } + break; + + default: + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'The application environment is not set correctly.'; + exit(1); // EXIT_ERROR +} + +/* + *--------------------------------------------------------------- + * SYSTEM DIRECTORY NAME + *--------------------------------------------------------------- + * + * This variable must contain the name of your "system" directory. + * Set the path if it is not in the same directory as this file. + */ + $system_path = 'system'; + +/* + *--------------------------------------------------------------- + * APPLICATION DIRECTORY NAME + *--------------------------------------------------------------- + * + * If you want this front controller to use a different "application" + * directory than the default one you can set its name here. The directory + * can also be renamed or relocated anywhere on your server. If you do, + * use an absolute (full) server path. + * For more info please see the user guide: + * + * https://codeigniter.com/user_guide/general/managing_apps.html + * + * NO TRAILING SLASH! + */ + $application_folder = 'application'; + +/* + *--------------------------------------------------------------- + * VIEW DIRECTORY NAME + *--------------------------------------------------------------- + * + * If you want to move the view directory out of the application + * directory, set the path to it here. The directory can be renamed + * and relocated anywhere on your server. If blank, it will default + * to the standard location inside your application directory. + * If you do move this, use an absolute (full) server path. + * + * NO TRAILING SLASH! + */ + $view_folder = ''; + + +/* + * -------------------------------------------------------------------- + * DEFAULT CONTROLLER + * -------------------------------------------------------------------- + * + * Normally you will set your default controller in the routes.php file. + * You can, however, force a custom routing by hard-coding a + * specific controller class/function here. For most applications, you + * WILL NOT set your routing here, but it's an option for those + * special instances where you might want to override the standard + * routing in a specific front controller that shares a common CI installation. + * + * IMPORTANT: If you set the routing here, NO OTHER controller will be + * callable. In essence, this preference limits your application to ONE + * specific controller. Leave the function name blank if you need + * to call functions dynamically via the URI. + * + * Un-comment the $routing array below to use this feature + */ + // The directory name, relative to the "controllers" directory. Leave blank + // if your controller is not in a sub-directory within the "controllers" one + // $routing['directory'] = ''; + + // The controller class file name. Example: mycontroller + // $routing['controller'] = ''; + + // The controller function you wish to be called. + // $routing['function'] = ''; + + +/* + * ------------------------------------------------------------------- + * CUSTOM CONFIG VALUES + * ------------------------------------------------------------------- + * + * The $assign_to_config array below will be passed dynamically to the + * config class when initialized. This allows you to set custom config + * items or override any default config values found in the config.php file. + * This can be handy as it permits you to share one application between + * multiple front controller files, with each file containing different + * config values. + * + * Un-comment the $assign_to_config array below to use this feature + */ + // $assign_to_config['name_of_config_item'] = 'value of config item'; + + + +// -------------------------------------------------------------------- +// END OF USER CONFIGURABLE SETTINGS. DO NOT EDIT BELOW THIS LINE +// -------------------------------------------------------------------- + +/* + * --------------------------------------------------------------- + * Resolve the system path for increased reliability + * --------------------------------------------------------------- + */ + + // Set the current directory correctly for CLI requests + if (defined('STDIN')) + { + chdir(dirname(__FILE__)); + } + + if (($_temp = realpath($system_path)) !== FALSE) + { + $system_path = $_temp.DIRECTORY_SEPARATOR; + } + else + { + // Ensure there's a trailing slash + $system_path = strtr( + rtrim($system_path, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ).DIRECTORY_SEPARATOR; + } + + // Is the system path correct? + if ( ! is_dir($system_path)) + { + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'Your system folder path does not appear to be set correctly. Please open the following file and correct this: '.pathinfo(__FILE__, PATHINFO_BASENAME); + exit(3); // EXIT_CONFIG + } + +/* + * ------------------------------------------------------------------- + * Now that we know the path, set the main path constants + * ------------------------------------------------------------------- + */ + // The name of THIS file + define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME)); + + // Path to the system directory + define('BASEPATH', $system_path); + + // Path to the front controller (this file) directory + define('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR); + + // Name of the "system" directory + define('SYSDIR', basename(BASEPATH)); + + // The path to the "application" directory + if (is_dir($application_folder)) + { + if (($_temp = realpath($application_folder)) !== FALSE) + { + $application_folder = $_temp; + } + else + { + $application_folder = strtr( + rtrim($application_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); + } + } + elseif (is_dir(BASEPATH.$application_folder.DIRECTORY_SEPARATOR)) + { + $application_folder = BASEPATH.strtr( + trim($application_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); + } + else + { + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; + exit(3); // EXIT_CONFIG + } + + define('APPPATH', $application_folder.DIRECTORY_SEPARATOR); + + // The path to the "views" directory + if ( ! isset($view_folder[0]) && is_dir(APPPATH.'views'.DIRECTORY_SEPARATOR)) + { + $view_folder = APPPATH.'views'; + } + elseif (is_dir($view_folder)) + { + if (($_temp = realpath($view_folder)) !== FALSE) + { + $view_folder = $_temp; + } + else + { + $view_folder = strtr( + rtrim($view_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); + } + } + elseif (is_dir(APPPATH.$view_folder.DIRECTORY_SEPARATOR)) + { + $view_folder = APPPATH.strtr( + trim($view_folder, '/\\'), + '/\\', + DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR + ); + } + else + { + header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); + echo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF; + exit(3); // EXIT_CONFIG + } + + define('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR); + +/* + * -------------------------------------------------------------------- + * LOAD THE BOOTSTRAP FILE + * -------------------------------------------------------------------- + * + * And away we go... + */ +require_once BASEPATH.'core/CodeIgniter.php'; diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 0000000..112ce7b --- /dev/null +++ b/nbproject/project.properties @@ -0,0 +1,7 @@ +include.path=${php.global.include.path} +php.version=PHP_74 +source.encoding=UTF-8 +src.dir=. +tags.asp=false +tags.short=false +web.root=. diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 0000000..8b92983 --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,9 @@ + + + org.netbeans.modules.php.project + + + FarmersKonnect + + + diff --git a/system/.htaccess b/system/.htaccess new file mode 100644 index 0000000..97c65d2 --- /dev/null +++ b/system/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + \ No newline at end of file diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php new file mode 100644 index 0000000..d6e1336 --- /dev/null +++ b/system/core/Benchmark.php @@ -0,0 +1,133 @@ +marker[$name] = microtime(TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Elapsed time + * + * Calculates the time difference between two marked points. + * + * If the first parameter is empty this function instead returns the + * {elapsed_time} pseudo-variable. This permits the full system + * execution time to be shown in a template. The output class will + * swap the real value for this variable. + * + * @param string $point1 A particular marked point + * @param string $point2 A particular marked point + * @param int $decimals Number of decimal places + * + * @return string Calculated elapsed time on success, + * an '{elapsed_string}' if $point1 is empty + * or an empty string if $point1 is not found. + */ + public function elapsed_time($point1 = '', $point2 = '', $decimals = 4) + { + if ($point1 === '') + { + return '{elapsed_time}'; + } + + if ( ! isset($this->marker[$point1])) + { + return ''; + } + + if ( ! isset($this->marker[$point2])) + { + $this->marker[$point2] = microtime(TRUE); + } + + return number_format($this->marker[$point2] - $this->marker[$point1], $decimals); + } + + // -------------------------------------------------------------------- + + /** + * Memory Usage + * + * Simply returns the {memory_usage} marker. + * + * This permits it to be put it anywhere in a template + * without the memory being calculated until the end. + * The output class will swap the real value for this variable. + * + * @return string '{memory_usage}' + */ + public function memory_usage() + { + return '{memory_usage}'; + } + +} diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php new file mode 100644 index 0000000..7b1dcc2 --- /dev/null +++ b/system/core/CodeIgniter.php @@ -0,0 +1,559 @@ + '_ENV', 'G' => '_GET', 'P' => '_POST', 'C' => '_COOKIE', 'S' => '_SERVER') as $key => $superglobal) + { + if (strpos($_registered, $key) === FALSE) + { + continue; + } + + foreach (array_keys($$superglobal) as $var) + { + if (isset($GLOBALS[$var]) && ! in_array($var, $_protected, TRUE)) + { + $GLOBALS[$var] = NULL; + } + } + } + } +} + + +/* + * ------------------------------------------------------ + * Define a custom error handler so we can log PHP errors + * ------------------------------------------------------ + */ + set_error_handler('_error_handler'); + set_exception_handler('_exception_handler'); + register_shutdown_function('_shutdown_handler'); + +/* + * ------------------------------------------------------ + * Set the subclass_prefix + * ------------------------------------------------------ + * + * Normally the "subclass_prefix" is set in the config file. + * The subclass prefix allows CI to know if a core class is + * being extended via a library in the local application + * "libraries" folder. Since CI allows config items to be + * overridden via data set in the main index.php file, + * before proceeding we need to know if a subclass_prefix + * override exists. If so, we will set this value now, + * before any classes are loaded + * Note: Since the config file data is cached it doesn't + * hurt to load it here. + */ + if ( ! empty($assign_to_config['subclass_prefix'])) + { + get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); + } + +/* + * ------------------------------------------------------ + * Should we use a Composer autoloader? + * ------------------------------------------------------ + */ + if ($composer_autoload = config_item('composer_autoload')) + { + if ($composer_autoload === TRUE) + { + file_exists(APPPATH.'vendor/autoload.php') + ? require_once(APPPATH.'vendor/autoload.php') + : log_message('error', '$config[\'composer_autoload\'] is set to TRUE but '.APPPATH.'vendor/autoload.php was not found.'); + } + elseif (file_exists($composer_autoload)) + { + require_once($composer_autoload); + } + else + { + log_message('error', 'Could not find the specified $config[\'composer_autoload\'] path: '.$composer_autoload); + } + } + +/* + * ------------------------------------------------------ + * Start the timer... tick tock tick tock... + * ------------------------------------------------------ + */ + $BM =& load_class('Benchmark', 'core'); + $BM->mark('total_execution_time_start'); + $BM->mark('loading_time:_base_classes_start'); + +/* + * ------------------------------------------------------ + * Instantiate the hooks class + * ------------------------------------------------------ + */ + $EXT =& load_class('Hooks', 'core'); + +/* + * ------------------------------------------------------ + * Is there a "pre_system" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('pre_system'); + +/* + * ------------------------------------------------------ + * Instantiate the config class + * ------------------------------------------------------ + * + * Note: It is important that Config is loaded first as + * most other classes depend on it either directly or by + * depending on another class that uses it. + * + */ + $CFG =& load_class('Config', 'core'); + + // Do we have any manually set config items in the index.php file? + if (isset($assign_to_config) && is_array($assign_to_config)) + { + foreach ($assign_to_config as $key => $value) + { + $CFG->set_item($key, $value); + } + } + +/* + * ------------------------------------------------------ + * Important charset-related stuff + * ------------------------------------------------------ + * + * Configure mbstring and/or iconv if they are enabled + * and set MB_ENABLED and ICONV_ENABLED constants, so + * that we don't repeatedly do extension_loaded() or + * function_exists() calls. + * + * Note: UTF-8 class depends on this. It used to be done + * in it's constructor, but it's _not_ class-specific. + * + */ + $charset = strtoupper(config_item('charset')); + ini_set('default_charset', $charset); + + if (extension_loaded('mbstring')) + { + define('MB_ENABLED', TRUE); + // mbstring.internal_encoding is deprecated starting with PHP 5.6 + // and it's usage triggers E_DEPRECATED messages. + @ini_set('mbstring.internal_encoding', $charset); + // This is required for mb_convert_encoding() to strip invalid characters. + // That's utilized by CI_Utf8, but it's also done for consistency with iconv. + mb_substitute_character('none'); + } + else + { + define('MB_ENABLED', FALSE); + } + + // There's an ICONV_IMPL constant, but the PHP manual says that using + // iconv's predefined constants is "strongly discouraged". + if (extension_loaded('iconv')) + { + define('ICONV_ENABLED', TRUE); + // iconv.internal_encoding is deprecated starting with PHP 5.6 + // and it's usage triggers E_DEPRECATED messages. + @ini_set('iconv.internal_encoding', $charset); + } + else + { + define('ICONV_ENABLED', FALSE); + } + + if (is_php('5.6')) + { + ini_set('php.internal_encoding', $charset); + } + +/* + * ------------------------------------------------------ + * Load compatibility features + * ------------------------------------------------------ + */ + + require_once(BASEPATH.'core/compat/mbstring.php'); + require_once(BASEPATH.'core/compat/hash.php'); + require_once(BASEPATH.'core/compat/password.php'); + require_once(BASEPATH.'core/compat/standard.php'); + +/* + * ------------------------------------------------------ + * Instantiate the UTF-8 class + * ------------------------------------------------------ + */ + $UNI =& load_class('Utf8', 'core'); + +/* + * ------------------------------------------------------ + * Instantiate the URI class + * ------------------------------------------------------ + */ + $URI =& load_class('URI', 'core'); + +/* + * ------------------------------------------------------ + * Instantiate the routing class and set the routing + * ------------------------------------------------------ + */ + $RTR =& load_class('Router', 'core', isset($routing) ? $routing : NULL); + +/* + * ------------------------------------------------------ + * Instantiate the output class + * ------------------------------------------------------ + */ + $OUT =& load_class('Output', 'core'); + +/* + * ------------------------------------------------------ + * Is there a valid cache file? If so, we're done... + * ------------------------------------------------------ + */ + if ($EXT->call_hook('cache_override') === FALSE && $OUT->_display_cache($CFG, $URI) === TRUE) + { + exit; + } + +/* + * ----------------------------------------------------- + * Load the security class for xss and csrf support + * ----------------------------------------------------- + */ + $SEC =& load_class('Security', 'core'); + +/* + * ------------------------------------------------------ + * Load the Input class and sanitize globals + * ------------------------------------------------------ + */ + $IN =& load_class('Input', 'core'); + +/* + * ------------------------------------------------------ + * Load the Language class + * ------------------------------------------------------ + */ + $LANG =& load_class('Lang', 'core'); + +/* + * ------------------------------------------------------ + * Load the app controller and local controller + * ------------------------------------------------------ + * + */ + // Load the base controller class + require_once BASEPATH.'core/Controller.php'; + + /** + * Reference to the CI_Controller method. + * + * Returns current CI instance object + * + * @return CI_Controller + */ + function &get_instance() + { + return CI_Controller::get_instance(); + } + + if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) + { + require_once APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; + } + + // Set a mark point for benchmarking + $BM->mark('loading_time:_base_classes_end'); + +/* + * ------------------------------------------------------ + * Sanity checks + * ------------------------------------------------------ + * + * The Router class has already validated the request, + * leaving us with 3 options here: + * + * 1) an empty class name, if we reached the default + * controller, but it didn't exist; + * 2) a query string which doesn't go through a + * file_exists() check + * 3) a regular request for a non-existing page + * + * We handle all of these as a 404 error. + * + * Furthermore, none of the methods in the app controller + * or the loader class can be called via the URI, nor can + * controller methods that begin with an underscore. + */ + + $e404 = FALSE; + $class = ucfirst($RTR->class); + $method = $RTR->method; + + if (empty($class) OR ! file_exists(APPPATH.'controllers/'.$RTR->directory.$class.'.php')) + { + $e404 = TRUE; + } + else + { + require_once(APPPATH.'controllers/'.$RTR->directory.$class.'.php'); + + if ( ! class_exists($class, FALSE) OR $method[0] === '_' OR method_exists('CI_Controller', $method)) + { + $e404 = TRUE; + } + elseif (method_exists($class, '_remap')) + { + $params = array($method, array_slice($URI->rsegments, 2)); + $method = '_remap'; + } + elseif ( ! method_exists($class, $method)) + { + $e404 = TRUE; + } + /** + * DO NOT CHANGE THIS, NOTHING ELSE WORKS! + * + * - method_exists() returns true for non-public methods, which passes the previous elseif + * - is_callable() returns false for PHP 4-style constructors, even if there's a __construct() + * - method_exists($class, '__construct') won't work because CI_Controller::__construct() is inherited + * - People will only complain if this doesn't work, even though it is documented that it shouldn't. + * + * ReflectionMethod::isConstructor() is the ONLY reliable check, + * knowing which method will be executed as a constructor. + */ + elseif ( ! is_callable(array($class, $method))) + { + $reflection = new ReflectionMethod($class, $method); + if ( ! $reflection->isPublic() OR $reflection->isConstructor()) + { + $e404 = TRUE; + } + } + } + + if ($e404) + { + if ( ! empty($RTR->routes['404_override'])) + { + if (sscanf($RTR->routes['404_override'], '%[^/]/%s', $error_class, $error_method) !== 2) + { + $error_method = 'index'; + } + + $error_class = ucfirst($error_class); + + if ( ! class_exists($error_class, FALSE)) + { + if (file_exists(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php')) + { + require_once(APPPATH.'controllers/'.$RTR->directory.$error_class.'.php'); + $e404 = ! class_exists($error_class, FALSE); + } + // Were we in a directory? If so, check for a global override + elseif ( ! empty($RTR->directory) && file_exists(APPPATH.'controllers/'.$error_class.'.php')) + { + require_once(APPPATH.'controllers/'.$error_class.'.php'); + if (($e404 = ! class_exists($error_class, FALSE)) === FALSE) + { + $RTR->directory = ''; + } + } + } + else + { + $e404 = FALSE; + } + } + + // Did we reset the $e404 flag? If so, set the rsegments, starting from index 1 + if ( ! $e404) + { + $class = $error_class; + $method = $error_method; + + $URI->rsegments = array( + 1 => $class, + 2 => $method + ); + } + else + { + show_404($RTR->directory.$class.'/'.$method); + } + } + + if ($method !== '_remap') + { + $params = array_slice($URI->rsegments, 2); + } + +/* + * ------------------------------------------------------ + * Is there a "pre_controller" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('pre_controller'); + +/* + * ------------------------------------------------------ + * Instantiate the requested controller + * ------------------------------------------------------ + */ + // Mark a start point so we can benchmark the controller + $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); + + $CI = new $class(); + +/* + * ------------------------------------------------------ + * Is there a "post_controller_constructor" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('post_controller_constructor'); + +/* + * ------------------------------------------------------ + * Call the requested method + * ------------------------------------------------------ + */ + call_user_func_array(array(&$CI, $method), $params); + + // Mark a benchmark end point + $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); + +/* + * ------------------------------------------------------ + * Is there a "post_controller" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('post_controller'); + +/* + * ------------------------------------------------------ + * Send the final rendered output to the browser + * ------------------------------------------------------ + */ + if ($EXT->call_hook('display_override') === FALSE) + { + $OUT->_display(); + } + +/* + * ------------------------------------------------------ + * Is there a "post_system" hook? + * ------------------------------------------------------ + */ + $EXT->call_hook('post_system'); diff --git a/system/core/Common.php b/system/core/Common.php new file mode 100644 index 0000000..6d60f23 --- /dev/null +++ b/system/core/Common.php @@ -0,0 +1,849 @@ +='); + } + + return $_is_php[$version]; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('is_really_writable')) +{ + /** + * Tests for file writability + * + * is_writable() returns TRUE on Windows servers when you really can't write to + * the file, based on the read-only attribute. is_writable() is also unreliable + * on Unix servers if safe_mode is on. + * + * @link https://bugs.php.net/bug.php?id=54709 + * @param string + * @return bool + */ + function is_really_writable($file) + { + // If we're on a Unix server with safe_mode off we call is_writable + if (DIRECTORY_SEPARATOR === '/' && (is_php('5.4') OR ! ini_get('safe_mode'))) + { + return is_writable($file); + } + + /* For Windows servers and safe_mode "on" installations we'll actually + * write a file then read it. Bah... + */ + if (is_dir($file)) + { + $file = rtrim($file, '/').'/'.md5(mt_rand()); + if (($fp = @fopen($file, 'ab')) === FALSE) + { + return FALSE; + } + + fclose($fp); + @chmod($file, 0777); + @unlink($file); + return TRUE; + } + elseif ( ! is_file($file) OR ($fp = @fopen($file, 'ab')) === FALSE) + { + return FALSE; + } + + fclose($fp); + return TRUE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('load_class')) +{ + /** + * Class registry + * + * This function acts as a singleton. If the requested class does not + * exist it is instantiated and set to a static variable. If it has + * previously been instantiated the variable is returned. + * + * @param string the class name being requested + * @param string the directory where the class should be found + * @param mixed an optional argument to pass to the class constructor + * @return object + */ + function &load_class($class, $directory = 'libraries', $param = NULL) + { + static $_classes = array(); + + // Does the class exist? If so, we're done... + if (isset($_classes[$class])) + { + return $_classes[$class]; + } + + $name = FALSE; + + // Look for the class first in the local application/libraries folder + // then in the native system/libraries folder + foreach (array(APPPATH, BASEPATH) as $path) + { + if (file_exists($path.$directory.'/'.$class.'.php')) + { + $name = 'CI_'.$class; + + if (class_exists($name, FALSE) === FALSE) + { + require_once($path.$directory.'/'.$class.'.php'); + } + + break; + } + } + + // Is the request a class extension? If so we load it too + if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')) + { + $name = config_item('subclass_prefix').$class; + + if (class_exists($name, FALSE) === FALSE) + { + require_once(APPPATH.$directory.'/'.$name.'.php'); + } + } + + // Did we find the class? + if ($name === FALSE) + { + // Note: We use exit() rather than show_error() in order to avoid a + // self-referencing loop with the Exceptions class + set_status_header(503); + echo 'Unable to locate the specified class: '.$class.'.php'; + exit(5); // EXIT_UNK_CLASS + } + + // Keep track of what we just loaded + is_loaded($class); + + $_classes[$class] = isset($param) + ? new $name($param) + : new $name(); + return $_classes[$class]; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('is_loaded')) +{ + /** + * Keeps track of which libraries have been loaded. This function is + * called by the load_class() function above + * + * @param string + * @return array + */ + function &is_loaded($class = '') + { + static $_is_loaded = array(); + + if ($class !== '') + { + $_is_loaded[strtolower($class)] = $class; + } + + return $_is_loaded; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('get_config')) +{ + /** + * Loads the main config.php file + * + * This function lets us grab the config file even if the Config class + * hasn't been instantiated yet + * + * @param array + * @return array + */ + function &get_config(Array $replace = array()) + { + static $config; + + if (empty($config)) + { + $file_path = APPPATH.'config/config.php'; + $found = FALSE; + if (file_exists($file_path)) + { + $found = TRUE; + require($file_path); + } + + // Is the config file in the environment folder? + if (file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) + { + require($file_path); + } + elseif ( ! $found) + { + set_status_header(503); + echo 'The configuration file does not exist.'; + exit(3); // EXIT_CONFIG + } + + // Does the $config array exist in the file? + if ( ! isset($config) OR ! is_array($config)) + { + set_status_header(503); + echo 'Your config file does not appear to be formatted correctly.'; + exit(3); // EXIT_CONFIG + } + } + + // Are any values being dynamically added or replaced? + foreach ($replace as $key => $val) + { + $config[$key] = $val; + } + + return $config; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('config_item')) +{ + /** + * Returns the specified config item + * + * @param string + * @return mixed + */ + function config_item($item) + { + static $_config; + + if (empty($_config)) + { + // references cannot be directly assigned to static variables, so we use an array + $_config[0] =& get_config(); + } + + return isset($_config[0][$item]) ? $_config[0][$item] : NULL; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('get_mimes')) +{ + /** + * Returns the MIME types array from config/mimes.php + * + * @return array + */ + function &get_mimes() + { + static $_mimes; + + if (empty($_mimes)) + { + $_mimes = file_exists(APPPATH.'config/mimes.php') + ? include(APPPATH.'config/mimes.php') + : array(); + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + { + $_mimes = array_merge($_mimes, include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')); + } + } + + return $_mimes; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('is_https')) +{ + /** + * Is HTTPS? + * + * Determines if the application is accessed via an encrypted + * (HTTPS) connection. + * + * @return bool + */ + function is_https() + { + if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') + { + return TRUE; + } + elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') + { + return TRUE; + } + elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') + { + return TRUE; + } + + return FALSE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('is_cli')) +{ + + /** + * Is CLI? + * + * Test to see if a request was made from the command line. + * + * @return bool + */ + function is_cli() + { + return (PHP_SAPI === 'cli' OR defined('STDIN')); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('show_error')) +{ + /** + * Error Handler + * + * This function lets us invoke the exception class and + * display errors using the standard error template located + * in application/views/errors/error_general.php + * This function will send the error page directly to the + * browser and exit. + * + * @param string + * @param int + * @param string + * @return void + */ + function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') + { + $status_code = abs($status_code); + if ($status_code < 100) + { + $exit_status = $status_code + 9; // 9 is EXIT__AUTO_MIN + $status_code = 500; + } + else + { + $exit_status = 1; // EXIT_ERROR + } + + $_error =& load_class('Exceptions', 'core'); + echo $_error->show_error($heading, $message, 'error_general', $status_code); + exit($exit_status); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('show_404')) +{ + /** + * 404 Page Handler + * + * This function is similar to the show_error() function above + * However, instead of the standard error template it displays + * 404 errors. + * + * @param string + * @param bool + * @return void + */ + function show_404($page = '', $log_error = TRUE) + { + $_error =& load_class('Exceptions', 'core'); + $_error->show_404($page, $log_error); + exit(4); // EXIT_UNKNOWN_FILE + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('log_message')) +{ + /** + * Error Logging Interface + * + * We use this as a simple mechanism to access the logging + * class and send messages to be logged. + * + * @param string the error level: 'error', 'debug' or 'info' + * @param string the error message + * @return void + */ + function log_message($level, $message) + { + static $_log; + + if ($_log === NULL) + { + // references cannot be directly assigned to static variables, so we use an array + $_log[0] =& load_class('Log', 'core'); + } + + $_log[0]->write_log($level, $message); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('set_status_header')) +{ + /** + * Set HTTP Status Header + * + * @param int the status code + * @param string + * @return void + */ + function set_status_header($code = 200, $text = '') + { + if (is_cli()) + { + return; + } + + if (empty($code) OR ! is_numeric($code)) + { + show_error('Status codes must be numeric', 500); + } + + if (empty($text)) + { + is_int($code) OR $code = (int) $code; + $stati = array( + 100 => 'Continue', + 101 => 'Switching Protocols', + + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + 422 => 'Unprocessable Entity', + 426 => 'Upgrade Required', + 428 => 'Precondition Required', + 429 => 'Too Many Requests', + 431 => 'Request Header Fields Too Large', + + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 511 => 'Network Authentication Required', + ); + + if (isset($stati[$code])) + { + $text = $stati[$code]; + } + else + { + show_error('No status text available. Please check your status code number or supply your own message text.', 500); + } + } + + if (strpos(PHP_SAPI, 'cgi') === 0) + { + header('Status: '.$code.' '.$text, TRUE); + return; + } + + $server_protocol = (isset($_SERVER['SERVER_PROTOCOL']) && in_array($_SERVER['SERVER_PROTOCOL'], array('HTTP/1.0', 'HTTP/1.1', 'HTTP/2'), TRUE)) + ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'; + header($server_protocol.' '.$code.' '.$text, TRUE, $code); + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('_error_handler')) +{ + /** + * Error Handler + * + * This is the custom error handler that is declared at the (relative) + * top of CodeIgniter.php. The main reason we use this is to permit + * PHP errors to be logged in our own log files since the user may + * not have access to server logs. Since this function effectively + * intercepts PHP errors, however, we also need to display errors + * based on the current error_reporting level. + * We do that with the use of a PHP error template. + * + * @param int $severity + * @param string $message + * @param string $filepath + * @param int $line + * @return void + */ + function _error_handler($severity, $message, $filepath, $line) + { + $is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); + + // When an error occurred, set the status header to '500 Internal Server Error' + // to indicate to the client something went wrong. + // This can't be done within the $_error->show_php_error method because + // it is only called when the display_errors flag is set (which isn't usually + // the case in a production environment) or when errors are ignored because + // they are above the error_reporting threshold. + if ($is_error) + { + set_status_header(500); + } + + // Should we ignore the error? We'll get the current error_reporting + // level and add its bits with the severity bits to find out. + if (($severity & error_reporting()) !== $severity) + { + return; + } + + $_error =& load_class('Exceptions', 'core'); + $_error->log_exception($severity, $message, $filepath, $line); + + // Should we display the error? + if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) + { + $_error->show_php_error($severity, $message, $filepath, $line); + } + + // If the error is fatal, the execution of the script should be stopped because + // errors can't be recovered from. Halting the script conforms with PHP's + // default error handling. See http://www.php.net/manual/en/errorfunc.constants.php + if ($is_error) + { + exit(1); // EXIT_ERROR + } + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('_exception_handler')) +{ + /** + * Exception Handler + * + * Sends uncaught exceptions to the logger and displays them + * only if display_errors is On so that they don't show up in + * production environments. + * + * @param Exception $exception + * @return void + */ + function _exception_handler($exception) + { + $_error =& load_class('Exceptions', 'core'); + $_error->log_exception('error', 'Exception: '.$exception->getMessage(), $exception->getFile(), $exception->getLine()); + + is_cli() OR set_status_header(500); + // Should we display the error? + if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))) + { + $_error->show_exception($exception); + } + + exit(1); // EXIT_ERROR + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('_shutdown_handler')) +{ + /** + * Shutdown Handler + * + * This is the shutdown handler that is declared at the top + * of CodeIgniter.php. The main reason we use this is to simulate + * a complete custom exception handler. + * + * E_STRICT is purposively neglected because such events may have + * been caught. Duplication or none? None is preferred for now. + * + * @link http://insomanic.me.uk/post/229851073/php-trick-catching-fatal-errors-e-error-with-a + * @return void + */ + function _shutdown_handler() + { + $last_error = error_get_last(); + if (isset($last_error) && + ($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) + { + _error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']); + } + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('remove_invisible_characters')) +{ + /** + * Remove Invisible Characters + * + * This prevents sandwiching null characters + * between ascii characters, like Java\0script. + * + * @param string + * @param bool + * @return string + */ + function remove_invisible_characters($str, $url_encoded = TRUE) + { + $non_displayables = array(); + + // every control character except newline (dec 10), + // carriage return (dec 13) and horizontal tab (dec 09) + if ($url_encoded) + { + $non_displayables[] = '/%0[0-8bcef]/i'; // url encoded 00-08, 11, 12, 14, 15 + $non_displayables[] = '/%1[0-9a-f]/i'; // url encoded 16-31 + $non_displayables[] = '/%7f/i'; // url encoded 127 + } + + $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 + + do + { + $str = preg_replace($non_displayables, '', $str, -1, $count); + } + while ($count); + + return $str; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('html_escape')) +{ + /** + * Returns HTML escaped variable. + * + * @param mixed $var The input string or array of strings to be escaped. + * @param bool $double_encode $double_encode set to FALSE prevents escaping twice. + * @return mixed The escaped string or array of strings as a result. + */ + function html_escape($var, $double_encode = TRUE) + { + if (empty($var)) + { + return $var; + } + + if (is_array($var)) + { + foreach (array_keys($var) as $key) + { + $var[$key] = html_escape($var[$key], $double_encode); + } + + return $var; + } + + return htmlspecialchars($var, ENT_QUOTES, config_item('charset'), $double_encode); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('_stringify_attributes')) +{ + /** + * Stringify attributes for use in HTML tags. + * + * Helper function used to convert a string, array, or object + * of attributes to a string. + * + * @param mixed string, array, object + * @param bool + * @return string + */ + function _stringify_attributes($attributes, $js = FALSE) + { + $atts = NULL; + + if (empty($attributes)) + { + return $atts; + } + + if (is_string($attributes)) + { + return ' '.$attributes; + } + + $attributes = (array) $attributes; + + foreach ($attributes as $key => $val) + { + $atts .= ($js) ? $key.'='.$val.',' : ' '.$key.'="'.$val.'"'; + } + + return rtrim($atts, ','); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('function_usable')) +{ + /** + * Function usable + * + * Executes a function_exists() check, and if the Suhosin PHP + * extension is loaded - checks whether the function that is + * checked might be disabled in there as well. + * + * This is useful as function_exists() will return FALSE for + * functions disabled via the *disable_functions* php.ini + * setting, but not for *suhosin.executor.func.blacklist* and + * *suhosin.executor.disable_eval*. These settings will just + * terminate script execution if a disabled function is executed. + * + * The above described behavior turned out to be a bug in Suhosin, + * but even though a fix was committed for 0.9.34 on 2012-02-12, + * that version is yet to be released. This function will therefore + * be just temporary, but would probably be kept for a few years. + * + * @link http://www.hardened-php.net/suhosin/ + * @param string $function_name Function to check for + * @return bool TRUE if the function exists and is safe to call, + * FALSE otherwise. + */ + function function_usable($function_name) + { + static $_suhosin_func_blacklist; + + if (function_exists($function_name)) + { + if ( ! isset($_suhosin_func_blacklist)) + { + $_suhosin_func_blacklist = extension_loaded('suhosin') + ? explode(',', trim(ini_get('suhosin.executor.func.blacklist'))) + : array(); + } + + return ! in_array($function_name, $_suhosin_func_blacklist, TRUE); + } + + return FALSE; + } +} diff --git a/system/core/Config.php b/system/core/Config.php new file mode 100644 index 0000000..8136dd2 --- /dev/null +++ b/system/core/Config.php @@ -0,0 +1,379 @@ +config =& get_config(); + + // Set the base_url automatically if none was provided + if (empty($this->config['base_url'])) + { + if (isset($_SERVER['SERVER_ADDR'])) + { + if (strpos($_SERVER['SERVER_ADDR'], ':') !== FALSE) + { + $server_addr = '['.$_SERVER['SERVER_ADDR'].']'; + } + else + { + $server_addr = $_SERVER['SERVER_ADDR']; + } + + $base_url = (is_https() ? 'https' : 'http').'://'.$server_addr + .substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); + } + else + { + $base_url = 'http://localhost/'; + } + + $this->set_item('base_url', $base_url); + } + + log_message('info', 'Config Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Load Config File + * + * @param string $file Configuration file name + * @param bool $use_sections Whether configuration values should be loaded into their own section + * @param bool $fail_gracefully Whether to just return FALSE or display an error message + * @return bool TRUE if the file was loaded correctly or FALSE on failure + */ + public function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) + { + $file = ($file === '') ? 'config' : str_replace('.php', '', $file); + $loaded = FALSE; + + foreach ($this->_config_paths as $path) + { + foreach (array($file, ENVIRONMENT.DIRECTORY_SEPARATOR.$file) as $location) + { + $file_path = $path.'config/'.$location.'.php'; + if (in_array($file_path, $this->is_loaded, TRUE)) + { + return TRUE; + } + + if ( ! file_exists($file_path)) + { + continue; + } + + include($file_path); + + if ( ! isset($config) OR ! is_array($config)) + { + if ($fail_gracefully === TRUE) + { + return FALSE; + } + + show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.'); + } + + if ($use_sections === TRUE) + { + $this->config[$file] = isset($this->config[$file]) + ? array_merge($this->config[$file], $config) + : $config; + } + else + { + $this->config = array_merge($this->config, $config); + } + + $this->is_loaded[] = $file_path; + $config = NULL; + $loaded = TRUE; + log_message('debug', 'Config file loaded: '.$file_path); + } + } + + if ($loaded === TRUE) + { + return TRUE; + } + elseif ($fail_gracefully === TRUE) + { + return FALSE; + } + + show_error('The configuration file '.$file.'.php does not exist.'); + } + + // -------------------------------------------------------------------- + + /** + * Fetch a config file item + * + * @param string $item Config item name + * @param string $index Index name + * @return string|null The configuration item or NULL if the item doesn't exist + */ + public function item($item, $index = '') + { + if ($index == '') + { + return isset($this->config[$item]) ? $this->config[$item] : NULL; + } + + return isset($this->config[$index], $this->config[$index][$item]) ? $this->config[$index][$item] : NULL; + } + + // -------------------------------------------------------------------- + + /** + * Fetch a config file item with slash appended (if not empty) + * + * @param string $item Config item name + * @return string|null The configuration item or NULL if the item doesn't exist + */ + public function slash_item($item) + { + if ( ! isset($this->config[$item])) + { + return NULL; + } + elseif (trim($this->config[$item]) === '') + { + return ''; + } + + return rtrim($this->config[$item], '/').'/'; + } + + // -------------------------------------------------------------------- + + /** + * Site URL + * + * Returns base_url . index_page [. uri_string] + * + * @uses CI_Config::_uri_string() + * + * @param string|string[] $uri URI string or an array of segments + * @param string $protocol + * @return string + */ + public function site_url($uri = '', $protocol = NULL) + { + $base_url = $this->slash_item('base_url'); + + if (isset($protocol)) + { + // For protocol-relative links + if ($protocol === '') + { + $base_url = substr($base_url, strpos($base_url, '//')); + } + else + { + $base_url = $protocol.substr($base_url, strpos($base_url, '://')); + } + } + + if (empty($uri)) + { + return $base_url.$this->item('index_page'); + } + + $uri = $this->_uri_string($uri); + + if ($this->item('enable_query_strings') === FALSE) + { + $suffix = isset($this->config['url_suffix']) ? $this->config['url_suffix'] : ''; + + if ($suffix !== '') + { + if (($offset = strpos($uri, '?')) !== FALSE) + { + $uri = substr($uri, 0, $offset).$suffix.substr($uri, $offset); + } + else + { + $uri .= $suffix; + } + } + + return $base_url.$this->slash_item('index_page').$uri; + } + elseif (strpos($uri, '?') === FALSE) + { + $uri = '?'.$uri; + } + + return $base_url.$this->item('index_page').$uri; + } + + // ------------------------------------------------------------- + + /** + * Base URL + * + * Returns base_url [. uri_string] + * + * @uses CI_Config::_uri_string() + * + * @param string|string[] $uri URI string or an array of segments + * @param string $protocol + * @return string + */ + public function base_url($uri = '', $protocol = NULL) + { + $base_url = $this->slash_item('base_url'); + + if (isset($protocol)) + { + // For protocol-relative links + if ($protocol === '') + { + $base_url = substr($base_url, strpos($base_url, '//')); + } + else + { + $base_url = $protocol.substr($base_url, strpos($base_url, '://')); + } + } + + return $base_url.$this->_uri_string($uri); + } + + // ------------------------------------------------------------- + + /** + * Build URI string + * + * @used-by CI_Config::site_url() + * @used-by CI_Config::base_url() + * + * @param string|string[] $uri URI string or an array of segments + * @return string + */ + protected function _uri_string($uri) + { + if ($this->item('enable_query_strings') === FALSE) + { + is_array($uri) && $uri = implode('/', $uri); + return ltrim($uri, '/'); + } + elseif (is_array($uri)) + { + return http_build_query($uri); + } + + return $uri; + } + + // -------------------------------------------------------------------- + + /** + * System URL + * + * @deprecated 3.0.0 Encourages insecure practices + * @return string + */ + public function system_url() + { + $x = explode('/', preg_replace('|/*(.+?)/*$|', '\\1', BASEPATH)); + return $this->slash_item('base_url').end($x).'/'; + } + + // -------------------------------------------------------------------- + + /** + * Set a config file item + * + * @param string $item Config item key + * @param string $value Config item value + * @return void + */ + public function set_item($item, $value) + { + $this->config[$item] = $value; + } + +} diff --git a/system/core/Controller.php b/system/core/Controller.php new file mode 100644 index 0000000..ec9aa2a --- /dev/null +++ b/system/core/Controller.php @@ -0,0 +1,96 @@ + $class) + { + $this->$var =& load_class($class); + } + + $this->load =& load_class('Loader', 'core'); + $this->load->initialize(); + log_message('info', 'Controller Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Get the CI singleton + * + * @static + * @return object + */ + public static function &get_instance() + { + return self::$instance; + } + +} diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php new file mode 100644 index 0000000..5a78376 --- /dev/null +++ b/system/core/Exceptions.php @@ -0,0 +1,274 @@ + 'Error', + E_WARNING => 'Warning', + E_PARSE => 'Parsing Error', + E_NOTICE => 'Notice', + E_CORE_ERROR => 'Core Error', + E_CORE_WARNING => 'Core Warning', + E_COMPILE_ERROR => 'Compile Error', + E_COMPILE_WARNING => 'Compile Warning', + E_USER_ERROR => 'User Error', + E_USER_WARNING => 'User Warning', + E_USER_NOTICE => 'User Notice', + E_STRICT => 'Runtime Notice' + ); + + /** + * Class constructor + * + * @return void + */ + public function __construct() + { + $this->ob_level = ob_get_level(); + // Note: Do not log messages from this constructor. + } + + // -------------------------------------------------------------------- + + /** + * Exception Logger + * + * Logs PHP generated error messages + * + * @param int $severity Log level + * @param string $message Error message + * @param string $filepath File path + * @param int $line Line number + * @return void + */ + public function log_exception($severity, $message, $filepath, $line) + { + $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; + log_message('error', 'Severity: '.$severity.' --> '.$message.' '.$filepath.' '.$line); + } + + // -------------------------------------------------------------------- + + /** + * 404 Error Handler + * + * @uses CI_Exceptions::show_error() + * + * @param string $page Page URI + * @param bool $log_error Whether to log the error + * @return void + */ + public function show_404($page = '', $log_error = TRUE) + { + if (is_cli()) + { + $heading = 'Not Found'; + $message = 'The controller/method pair you requested was not found.'; + } + else + { + $heading = '404 Page Not Found'; + $message = 'The page you requested was not found.'; + } + + // By default we log this, but allow a dev to skip it + if ($log_error) + { + log_message('error', $heading.': '.$page); + } + + echo $this->show_error($heading, $message, 'error_404', 404); + exit(4); // EXIT_UNKNOWN_FILE + } + + // -------------------------------------------------------------------- + + /** + * General Error Page + * + * Takes an error message as input (either as a string or an array) + * and displays it using the specified template. + * + * @param string $heading Page heading + * @param string|string[] $message Error message + * @param string $template Template name + * @param int $status_code (default: 500) + * + * @return string Error page output + */ + public function show_error($heading, $message, $template = 'error_general', $status_code = 500) + { + $templates_path = config_item('error_views_path'); + if (empty($templates_path)) + { + $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; + } + + if (is_cli()) + { + $message = "\t".(is_array($message) ? implode("\n\t", $message) : $message); + $template = 'cli'.DIRECTORY_SEPARATOR.$template; + } + else + { + set_status_header($status_code); + $message = '

    '.(is_array($message) ? implode('

    ', $message) : $message).'

    '; + $template = 'html'.DIRECTORY_SEPARATOR.$template; + } + + if (ob_get_level() > $this->ob_level + 1) + { + ob_end_flush(); + } + ob_start(); + include($templates_path.$template.'.php'); + $buffer = ob_get_contents(); + ob_end_clean(); + return $buffer; + } + + // -------------------------------------------------------------------- + + public function show_exception($exception) + { + $templates_path = config_item('error_views_path'); + if (empty($templates_path)) + { + $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; + } + + $message = $exception->getMessage(); + if (empty($message)) + { + $message = '(null)'; + } + + if (is_cli()) + { + $templates_path .= 'cli'.DIRECTORY_SEPARATOR; + } + else + { + $templates_path .= 'html'.DIRECTORY_SEPARATOR; + } + + if (ob_get_level() > $this->ob_level + 1) + { + ob_end_flush(); + } + + ob_start(); + include($templates_path.'error_exception.php'); + $buffer = ob_get_contents(); + ob_end_clean(); + echo $buffer; + } + + // -------------------------------------------------------------------- + + /** + * Native PHP error handler + * + * @param int $severity Error level + * @param string $message Error message + * @param string $filepath File path + * @param int $line Line number + * @return void + */ + public function show_php_error($severity, $message, $filepath, $line) + { + $templates_path = config_item('error_views_path'); + if (empty($templates_path)) + { + $templates_path = VIEWPATH.'errors'.DIRECTORY_SEPARATOR; + } + + $severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity; + + // For safety reasons we don't show the full file path in non-CLI requests + if ( ! is_cli()) + { + $filepath = str_replace('\\', '/', $filepath); + if (FALSE !== strpos($filepath, '/')) + { + $x = explode('/', $filepath); + $filepath = $x[count($x)-2].'/'.end($x); + } + + $template = 'html'.DIRECTORY_SEPARATOR.'error_php'; + } + else + { + $template = 'cli'.DIRECTORY_SEPARATOR.'error_php'; + } + + if (ob_get_level() > $this->ob_level + 1) + { + ob_end_flush(); + } + ob_start(); + include($templates_path.$template.'.php'); + $buffer = ob_get_contents(); + ob_end_clean(); + echo $buffer; + } + +} diff --git a/system/core/Hooks.php b/system/core/Hooks.php new file mode 100644 index 0000000..82c68b1 --- /dev/null +++ b/system/core/Hooks.php @@ -0,0 +1,266 @@ +item('enable_hooks') === FALSE) + { + return; + } + + // Grab the "hooks" definition file. + if (file_exists(APPPATH.'config/hooks.php')) + { + include(APPPATH.'config/hooks.php'); + } + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); + } + + // If there are no hooks, we're done. + if ( ! isset($hook) OR ! is_array($hook)) + { + return; + } + + $this->hooks =& $hook; + $this->enabled = TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Call Hook + * + * Calls a particular hook. Called by CodeIgniter.php. + * + * @uses CI_Hooks::_run_hook() + * + * @param string $which Hook name + * @return bool TRUE on success or FALSE on failure + */ + public function call_hook($which = '') + { + if ( ! $this->enabled OR ! isset($this->hooks[$which])) + { + return FALSE; + } + + if (is_array($this->hooks[$which]) && ! isset($this->hooks[$which]['function'])) + { + foreach ($this->hooks[$which] as $val) + { + $this->_run_hook($val); + } + } + else + { + $this->_run_hook($this->hooks[$which]); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Run Hook + * + * Runs a particular hook + * + * @param array $data Hook details + * @return bool TRUE on success or FALSE on failure + */ + protected function _run_hook($data) + { + // Closures/lambda functions and array($object, 'method') callables + if (is_callable($data)) + { + is_array($data) + ? $data[0]->{$data[1]}() + : $data(); + + return TRUE; + } + elseif ( ! is_array($data)) + { + return FALSE; + } + + // ----------------------------------- + // Safety - Prevents run-away loops + // ----------------------------------- + + // If the script being called happens to have the same + // hook call within it a loop can happen + if ($this->_in_progress === TRUE) + { + return; + } + + // ----------------------------------- + // Set file path + // ----------------------------------- + + if ( ! isset($data['filepath'], $data['filename'])) + { + return FALSE; + } + + $filepath = APPPATH.$data['filepath'].'/'.$data['filename']; + + if ( ! file_exists($filepath)) + { + return FALSE; + } + + // Determine and class and/or function names + $class = empty($data['class']) ? FALSE : $data['class']; + $function = empty($data['function']) ? FALSE : $data['function']; + $params = isset($data['params']) ? $data['params'] : ''; + + if (empty($function)) + { + return FALSE; + } + + // Set the _in_progress flag + $this->_in_progress = TRUE; + + // Call the requested class and/or function + if ($class !== FALSE) + { + // The object is stored? + if (isset($this->_objects[$class])) + { + if (method_exists($this->_objects[$class], $function)) + { + $this->_objects[$class]->$function($params); + } + else + { + return $this->_in_progress = FALSE; + } + } + else + { + class_exists($class, FALSE) OR require_once($filepath); + + if ( ! class_exists($class, FALSE) OR ! method_exists($class, $function)) + { + return $this->_in_progress = FALSE; + } + + // Store the object and execute the method + $this->_objects[$class] = new $class(); + $this->_objects[$class]->$function($params); + } + } + else + { + function_exists($function) OR require_once($filepath); + + if ( ! function_exists($function)) + { + return $this->_in_progress = FALSE; + } + + $function($params); + } + + $this->_in_progress = FALSE; + return TRUE; + } + +} diff --git a/system/core/Input.php b/system/core/Input.php new file mode 100644 index 0000000..143babf --- /dev/null +++ b/system/core/Input.php @@ -0,0 +1,895 @@ +_allow_get_array = (config_item('allow_get_array') !== FALSE); + $this->_enable_xss = (config_item('global_xss_filtering') === TRUE); + $this->_enable_csrf = (config_item('csrf_protection') === TRUE); + $this->_standardize_newlines = (bool) config_item('standardize_newlines'); + + $this->security =& load_class('Security', 'core'); + + // Do we need the UTF-8 class? + if (UTF8_ENABLED === TRUE) + { + $this->uni =& load_class('Utf8', 'core'); + } + + // Sanitize global arrays + $this->_sanitize_globals(); + + // CSRF Protection check + if ($this->_enable_csrf === TRUE && ! is_cli()) + { + $this->security->csrf_verify(); + } + + log_message('info', 'Input Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Fetch from array + * + * Internal method used to retrieve values from global arrays. + * + * @param array &$array $_GET, $_POST, $_COOKIE, $_SERVER, etc. + * @param mixed $index Index for item to be fetched from $array + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + protected function _fetch_from_array(&$array, $index = NULL, $xss_clean = NULL) + { + is_bool($xss_clean) OR $xss_clean = $this->_enable_xss; + + // If $index is NULL, it means that the whole $array is requested + isset($index) OR $index = array_keys($array); + + // allow fetching multiple keys at once + if (is_array($index)) + { + $output = array(); + foreach ($index as $key) + { + $output[$key] = $this->_fetch_from_array($array, $key, $xss_clean); + } + + return $output; + } + + if (isset($array[$index])) + { + $value = $array[$index]; + } + elseif (($count = preg_match_all('/(?:^[^\[]+)|\[[^]]*\]/', $index, $matches)) > 1) // Does the index contain array notation + { + $value = $array; + for ($i = 0; $i < $count; $i++) + { + $key = trim($matches[0][$i], '[]'); + if ($key === '') // Empty notation will return the value as array + { + break; + } + + if (isset($value[$key])) + { + $value = $value[$key]; + } + else + { + return NULL; + } + } + } + else + { + return NULL; + } + + return ($xss_clean === TRUE) + ? $this->security->xss_clean($value) + : $value; + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the GET array + * + * @param mixed $index Index for item to be fetched from $_GET + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function get($index = NULL, $xss_clean = NULL) + { + return $this->_fetch_from_array($_GET, $index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the POST array + * + * @param mixed $index Index for item to be fetched from $_POST + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function post($index = NULL, $xss_clean = NULL) + { + return $this->_fetch_from_array($_POST, $index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from POST data with fallback to GET + * + * @param string $index Index for item to be fetched from $_POST or $_GET + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function post_get($index, $xss_clean = NULL) + { + return isset($_POST[$index]) + ? $this->post($index, $xss_clean) + : $this->get($index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from GET data with fallback to POST + * + * @param string $index Index for item to be fetched from $_GET or $_POST + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function get_post($index, $xss_clean = NULL) + { + return isset($_GET[$index]) + ? $this->get($index, $xss_clean) + : $this->post($index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the COOKIE array + * + * @param mixed $index Index for item to be fetched from $_COOKIE + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function cookie($index = NULL, $xss_clean = NULL) + { + return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the SERVER array + * + * @param mixed $index Index for item to be fetched from $_SERVER + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function server($index, $xss_clean = NULL) + { + return $this->_fetch_from_array($_SERVER, $index, $xss_clean); + } + + // ------------------------------------------------------------------------ + + /** + * Fetch an item from the php://input stream + * + * Useful when you need to access PUT, DELETE or PATCH request data. + * + * @param string $index Index for item to be fetched + * @param bool $xss_clean Whether to apply XSS filtering + * @return mixed + */ + public function input_stream($index = NULL, $xss_clean = NULL) + { + // Prior to PHP 5.6, the input stream can only be read once, + // so we'll need to check if we have already done that first. + if ( ! is_array($this->_input_stream)) + { + // $this->raw_input_stream will trigger __get(). + parse_str($this->raw_input_stream, $this->_input_stream); + is_array($this->_input_stream) OR $this->_input_stream = array(); + } + + return $this->_fetch_from_array($this->_input_stream, $index, $xss_clean); + } + + // ------------------------------------------------------------------------ + + /** + * Set cookie + * + * Accepts an arbitrary number of parameters (up to 7) or an associative + * array in the first parameter containing all the values. + * + * @param string|mixed[] $name Cookie name or an array containing parameters + * @param string $value Cookie value + * @param int $expire Cookie expiration time in seconds + * @param string $domain Cookie domain (e.g.: '.yourdomain.com') + * @param string $path Cookie path (default: '/') + * @param string $prefix Cookie name prefix + * @param bool $secure Whether to only transfer cookies via SSL + * @param bool $httponly Whether to only makes the cookie accessible via HTTP (no javascript) + * @return void + */ + public function set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = NULL, $httponly = NULL) + { + if (is_array($name)) + { + // always leave 'name' in last place, as the loop will break otherwise, due to $$item + foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'httponly', 'name') as $item) + { + if (isset($name[$item])) + { + $$item = $name[$item]; + } + } + } + + if ($prefix === '' && config_item('cookie_prefix') !== '') + { + $prefix = config_item('cookie_prefix'); + } + + if ($domain == '' && config_item('cookie_domain') != '') + { + $domain = config_item('cookie_domain'); + } + + if ($path === '/' && config_item('cookie_path') !== '/') + { + $path = config_item('cookie_path'); + } + + $secure = ($secure === NULL && config_item('cookie_secure') !== NULL) + ? (bool) config_item('cookie_secure') + : (bool) $secure; + + $httponly = ($httponly === NULL && config_item('cookie_httponly') !== NULL) + ? (bool) config_item('cookie_httponly') + : (bool) $httponly; + + if ( ! is_numeric($expire)) + { + $expire = time() - 86500; + } + else + { + $expire = ($expire > 0) ? time() + $expire : 0; + } + + setcookie($prefix.$name, $value, $expire, $path, $domain, $secure, $httponly); + } + + // -------------------------------------------------------------------- + + /** + * Fetch the IP Address + * + * Determines and validates the visitor's IP address. + * + * @return string IP address + */ + public function ip_address() + { + if ($this->ip_address !== FALSE) + { + return $this->ip_address; + } + + $proxy_ips = config_item('proxy_ips'); + if ( ! empty($proxy_ips) && ! is_array($proxy_ips)) + { + $proxy_ips = explode(',', str_replace(' ', '', $proxy_ips)); + } + + $this->ip_address = $this->server('REMOTE_ADDR'); + + if ($proxy_ips) + { + foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header) + { + if (($spoof = $this->server($header)) !== NULL) + { + // Some proxies typically list the whole chain of IP + // addresses through which the client has reached us. + // e.g. client_ip, proxy_ip1, proxy_ip2, etc. + sscanf($spoof, '%[^,]', $spoof); + + if ( ! $this->valid_ip($spoof)) + { + $spoof = NULL; + } + else + { + break; + } + } + } + + if ($spoof) + { + for ($i = 0, $c = count($proxy_ips); $i < $c; $i++) + { + // Check if we have an IP address or a subnet + if (strpos($proxy_ips[$i], '/') === FALSE) + { + // An IP address (and not a subnet) is specified. + // We can compare right away. + if ($proxy_ips[$i] === $this->ip_address) + { + $this->ip_address = $spoof; + break; + } + + continue; + } + + // We have a subnet ... now the heavy lifting begins + isset($separator) OR $separator = $this->valid_ip($this->ip_address, 'ipv6') ? ':' : '.'; + + // If the proxy entry doesn't match the IP protocol - skip it + if (strpos($proxy_ips[$i], $separator) === FALSE) + { + continue; + } + + // Convert the REMOTE_ADDR IP address to binary, if needed + if ( ! isset($ip, $sprintf)) + { + if ($separator === ':') + { + // Make sure we're have the "full" IPv6 format + $ip = explode(':', + str_replace('::', + str_repeat(':', 9 - substr_count($this->ip_address, ':')), + $this->ip_address + ) + ); + + for ($j = 0; $j < 8; $j++) + { + $ip[$j] = intval($ip[$j], 16); + } + + $sprintf = '%016b%016b%016b%016b%016b%016b%016b%016b'; + } + else + { + $ip = explode('.', $this->ip_address); + $sprintf = '%08b%08b%08b%08b'; + } + + $ip = vsprintf($sprintf, $ip); + } + + // Split the netmask length off the network address + sscanf($proxy_ips[$i], '%[^/]/%d', $netaddr, $masklen); + + // Again, an IPv6 address is most likely in a compressed form + if ($separator === ':') + { + $netaddr = explode(':', str_replace('::', str_repeat(':', 9 - substr_count($netaddr, ':')), $netaddr)); + for ($j = 0; $j < 8; $j++) + { + $netaddr[$j] = intval($netaddr[$j], 16); + } + } + else + { + $netaddr = explode('.', $netaddr); + } + + // Convert to binary and finally compare + if (strncmp($ip, vsprintf($sprintf, $netaddr), $masklen) === 0) + { + $this->ip_address = $spoof; + break; + } + } + } + } + + if ( ! $this->valid_ip($this->ip_address)) + { + return $this->ip_address = '0.0.0.0'; + } + + return $this->ip_address; + } + + // -------------------------------------------------------------------- + + /** + * Validate IP Address + * + * @param string $ip IP address + * @param string $which IP protocol: 'ipv4' or 'ipv6' + * @return bool + */ + public function valid_ip($ip, $which = '') + { + switch (strtolower($which)) + { + case 'ipv4': + $which = FILTER_FLAG_IPV4; + break; + case 'ipv6': + $which = FILTER_FLAG_IPV6; + break; + default: + $which = NULL; + break; + } + + return (bool) filter_var($ip, FILTER_VALIDATE_IP, $which); + } + + // -------------------------------------------------------------------- + + /** + * Fetch User Agent string + * + * @return string|null User Agent string or NULL if it doesn't exist + */ + public function user_agent($xss_clean = NULL) + { + return $this->_fetch_from_array($_SERVER, 'HTTP_USER_AGENT', $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Sanitize Globals + * + * Internal method serving for the following purposes: + * + * - Unsets $_GET data, if query strings are not enabled + * - Cleans POST, COOKIE and SERVER data + * - Standardizes newline characters to PHP_EOL + * + * @return void + */ + protected function _sanitize_globals() + { + // Is $_GET data allowed? If not we'll set the $_GET to an empty array + if ($this->_allow_get_array === FALSE) + { + $_GET = array(); + } + elseif (is_array($_GET)) + { + foreach ($_GET as $key => $val) + { + $_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); + } + } + + // Clean $_POST Data + if (is_array($_POST)) + { + foreach ($_POST as $key => $val) + { + $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); + } + } + + // Clean $_COOKIE Data + if (is_array($_COOKIE)) + { + // Also get rid of specially treated cookies that might be set by a server + // or silly application, that are of no use to a CI application anyway + // but that when present will trip our 'Disallowed Key Characters' alarm + // http://www.ietf.org/rfc/rfc2109.txt + // note that the key names below are single quoted strings, and are not PHP variables + unset( + $_COOKIE['$Version'], + $_COOKIE['$Path'], + $_COOKIE['$Domain'] + ); + + foreach ($_COOKIE as $key => $val) + { + if (($cookie_key = $this->_clean_input_keys($key)) !== FALSE) + { + $_COOKIE[$cookie_key] = $this->_clean_input_data($val); + } + else + { + unset($_COOKIE[$key]); + } + } + } + + // Sanitize PHP_SELF + $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); + + log_message('debug', 'Global POST, GET and COOKIE data sanitized'); + } + + // -------------------------------------------------------------------- + + /** + * Clean Input Data + * + * Internal method that aids in escaping data and + * standardizing newline characters to PHP_EOL. + * + * @param string|string[] $str Input string(s) + * @return string + */ + protected function _clean_input_data($str) + { + if (is_array($str)) + { + $new_array = array(); + foreach (array_keys($str) as $key) + { + $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($str[$key]); + } + return $new_array; + } + + /* We strip slashes if magic quotes is on to keep things consistent + + NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and + it will probably not exist in future versions at all. + */ + if ( ! is_php('5.4') && get_magic_quotes_gpc()) + { + $str = stripslashes($str); + } + + // Clean UTF-8 if supported + if (UTF8_ENABLED === TRUE) + { + $str = $this->uni->clean_string($str); + } + + // Remove control characters + $str = remove_invisible_characters($str, FALSE); + + // Standardize newlines if needed + if ($this->_standardize_newlines === TRUE) + { + return preg_replace('/(?:\r\n|[\r\n])/', PHP_EOL, $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Clean Keys + * + * Internal method that helps to prevent malicious users + * from trying to exploit keys we make sure that keys are + * only named with alpha-numeric text and a few other items. + * + * @param string $str Input string + * @param bool $fatal Whether to terminate script exection + * or to return FALSE if an invalid + * key is encountered + * @return string|bool + */ + protected function _clean_input_keys($str, $fatal = TRUE) + { + if ( ! preg_match('/^[a-z0-9:_\/|-]+$/i', $str)) + { + if ($fatal === TRUE) + { + return FALSE; + } + else + { + set_status_header(503); + echo 'Disallowed Key Characters.'; + exit(7); // EXIT_USER_INPUT + } + } + + // Clean UTF-8 if supported + if (UTF8_ENABLED === TRUE) + { + return $this->uni->clean_string($str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Request Headers + * + * @param bool $xss_clean Whether to apply XSS filtering + * @return array + */ + public function request_headers($xss_clean = FALSE) + { + // If header is already defined, return it immediately + if ( ! empty($this->headers)) + { + return $this->_fetch_from_array($this->headers, NULL, $xss_clean); + } + + // In Apache, you can simply call apache_request_headers() + if (function_exists('apache_request_headers')) + { + $this->headers = apache_request_headers(); + } + else + { + isset($_SERVER['CONTENT_TYPE']) && $this->headers['Content-Type'] = $_SERVER['CONTENT_TYPE']; + + foreach ($_SERVER as $key => $val) + { + if (sscanf($key, 'HTTP_%s', $header) === 1) + { + // take SOME_HEADER and turn it into Some-Header + $header = str_replace('_', ' ', strtolower($header)); + $header = str_replace(' ', '-', ucwords($header)); + + $this->headers[$header] = $_SERVER[$key]; + } + } + } + + return $this->_fetch_from_array($this->headers, NULL, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Get Request Header + * + * Returns the value of a single member of the headers class member + * + * @param string $index Header name + * @param bool $xss_clean Whether to apply XSS filtering + * @return string|null The requested header on success or NULL on failure + */ + public function get_request_header($index, $xss_clean = FALSE) + { + static $headers; + + if ( ! isset($headers)) + { + empty($this->headers) && $this->request_headers(); + foreach ($this->headers as $key => $value) + { + $headers[strtolower($key)] = $value; + } + } + + $index = strtolower($index); + + if ( ! isset($headers[$index])) + { + return NULL; + } + + return ($xss_clean === TRUE) + ? $this->security->xss_clean($headers[$index]) + : $headers[$index]; + } + + // -------------------------------------------------------------------- + + /** + * Is AJAX request? + * + * Test to see if a request contains the HTTP_X_REQUESTED_WITH header. + * + * @return bool + */ + public function is_ajax_request() + { + return ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); + } + + // -------------------------------------------------------------------- + + /** + * Is CLI request? + * + * Test to see if a request was made from the command line. + * + * @deprecated 3.0.0 Use is_cli() instead + * @return bool + */ + public function is_cli_request() + { + return is_cli(); + } + + // -------------------------------------------------------------------- + + /** + * Get Request Method + * + * Return the request method + * + * @param bool $upper Whether to return in upper or lower case + * (default: FALSE) + * @return string + */ + public function method($upper = FALSE) + { + return ($upper) + ? strtoupper($this->server('REQUEST_METHOD')) + : strtolower($this->server('REQUEST_METHOD')); + } + + // ------------------------------------------------------------------------ + + /** + * Magic __get() + * + * Allows read access to protected properties + * + * @param string $name + * @return mixed + */ + public function __get($name) + { + if ($name === 'raw_input_stream') + { + isset($this->_raw_input_stream) OR $this->_raw_input_stream = file_get_contents('php://input'); + return $this->_raw_input_stream; + } + elseif ($name === 'ip_address') + { + return $this->ip_address; + } + } + +} diff --git a/system/core/Lang.php b/system/core/Lang.php new file mode 100644 index 0000000..39fdd06 --- /dev/null +++ b/system/core/Lang.php @@ -0,0 +1,203 @@ +load($value, $idiom, $return, $add_suffix, $alt_path); + } + + return; + } + + $langfile = str_replace('.php', '', $langfile); + + if ($add_suffix === TRUE) + { + $langfile = preg_replace('/_lang$/', '', $langfile).'_lang'; + } + + $langfile .= '.php'; + + if (empty($idiom) OR ! preg_match('/^[a-z_-]+$/i', $idiom)) + { + $config =& get_config(); + $idiom = empty($config['language']) ? 'english' : $config['language']; + } + + if ($return === FALSE && isset($this->is_loaded[$langfile]) && $this->is_loaded[$langfile] === $idiom) + { + return; + } + + // Load the base file, so any others found can override it + $basepath = BASEPATH.'language/'.$idiom.'/'.$langfile; + if (($found = file_exists($basepath)) === TRUE) + { + include($basepath); + } + + // Do we have an alternative path to look in? + if ($alt_path !== '') + { + $alt_path .= 'language/'.$idiom.'/'.$langfile; + if (file_exists($alt_path)) + { + include($alt_path); + $found = TRUE; + } + } + else + { + foreach (get_instance()->load->get_package_paths(TRUE) as $package_path) + { + $package_path .= 'language/'.$idiom.'/'.$langfile; + if ($basepath !== $package_path && file_exists($package_path)) + { + include($package_path); + $found = TRUE; + break; + } + } + } + + if ($found !== TRUE) + { + show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile); + } + + if ( ! isset($lang) OR ! is_array($lang)) + { + log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile); + + if ($return === TRUE) + { + return array(); + } + return; + } + + if ($return === TRUE) + { + return $lang; + } + + $this->is_loaded[$langfile] = $idiom; + $this->language = array_merge($this->language, $lang); + + log_message('info', 'Language file loaded: language/'.$idiom.'/'.$langfile); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Language line + * + * Fetches a single line of text from the language array + * + * @param string $line Language line key + * @param bool $log_errors Whether to log an error message if the line is not found + * @return string Translation + */ + public function line($line, $log_errors = TRUE) + { + $value = isset($this->language[$line]) ? $this->language[$line] : FALSE; + + // Because killer robots like unicorns! + if ($value === FALSE && $log_errors === TRUE) + { + log_message('error', 'Could not find the language line "'.$line.'"'); + } + + return $value; + } + +} diff --git a/system/core/Loader.php b/system/core/Loader.php new file mode 100644 index 0000000..c84aff3 --- /dev/null +++ b/system/core/Loader.php @@ -0,0 +1,1415 @@ + TRUE); + + /** + * List of paths to load libraries from + * + * @var array + */ + protected $_ci_library_paths = array(APPPATH, BASEPATH); + + /** + * List of paths to load models from + * + * @var array + */ + protected $_ci_model_paths = array(APPPATH); + + /** + * List of paths to load helpers from + * + * @var array + */ + protected $_ci_helper_paths = array(APPPATH, BASEPATH); + + /** + * List of cached variables + * + * @var array + */ + protected $_ci_cached_vars = array(); + + /** + * List of loaded classes + * + * @var array + */ + protected $_ci_classes = array(); + + /** + * List of loaded models + * + * @var array + */ + protected $_ci_models = array(); + + /** + * List of loaded helpers + * + * @var array + */ + protected $_ci_helpers = array(); + + /** + * List of class name mappings + * + * @var array + */ + protected $_ci_varmap = array( + 'unit_test' => 'unit', + 'user_agent' => 'agent' + ); + + // -------------------------------------------------------------------- + + /** + * Class constructor + * + * Sets component load paths, gets the initial output buffering level. + * + * @return void + */ + public function __construct() + { + $this->_ci_ob_level = ob_get_level(); + $this->_ci_classes =& is_loaded(); + + log_message('info', 'Loader Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Initializer + * + * @todo Figure out a way to move this to the constructor + * without breaking *package_path*() methods. + * @uses CI_Loader::_ci_autoloader() + * @used-by CI_Controller::__construct() + * @return void + */ + public function initialize() + { + $this->_ci_autoloader(); + } + + // -------------------------------------------------------------------- + + /** + * Is Loaded + * + * A utility method to test if a class is in the self::$_ci_classes array. + * + * @used-by Mainly used by Form Helper function _get_validation_object(). + * + * @param string $class Class name to check for + * @return string|bool Class object name if loaded or FALSE + */ + public function is_loaded($class) + { + return array_search(ucfirst($class), $this->_ci_classes, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Library Loader + * + * Loads and instantiates libraries. + * Designed to be called from application controllers. + * + * @param mixed $library Library name + * @param array $params Optional parameters to pass to the library class constructor + * @param string $object_name An optional object name to assign to + * @return object + */ + public function library($library, $params = NULL, $object_name = NULL) + { + if (empty($library)) + { + return $this; + } + elseif (is_array($library)) + { + foreach ($library as $key => $value) + { + if (is_int($key)) + { + $this->library($value, $params); + } + else + { + $this->library($key, $params, $value); + } + } + + return $this; + } + + if ($params !== NULL && ! is_array($params)) + { + $params = NULL; + } + + $this->_ci_load_library($library, $params, $object_name); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Model Loader + * + * Loads and instantiates models. + * + * @param mixed $model Model name + * @param string $name An optional object name to assign to + * @param bool $db_conn An optional database connection configuration to initialize + * @return object + */ + public function model($model, $name = '', $db_conn = FALSE) + { + if (empty($model)) + { + return $this; + } + elseif (is_array($model)) + { + foreach ($model as $key => $value) + { + is_int($key) ? $this->model($value, '', $db_conn) : $this->model($key, $value, $db_conn); + } + + return $this; + } + + $path = ''; + + // Is the model in a sub-folder? If so, parse out the filename and path. + if (($last_slash = strrpos($model, '/')) !== FALSE) + { + // The path is in front of the last slash + $path = substr($model, 0, ++$last_slash); + + // And the model name behind it + $model = substr($model, $last_slash); + } + + if (empty($name)) + { + $name = $model; + } + + if (in_array($name, $this->_ci_models, TRUE)) + { + return $this; + } + + $CI =& get_instance(); + if (isset($CI->$name)) + { + throw new RuntimeException('The model name you are loading is the name of a resource that is already being used: '.$name); + } + + if ($db_conn !== FALSE && ! class_exists('CI_DB', FALSE)) + { + if ($db_conn === TRUE) + { + $db_conn = ''; + } + + $this->database($db_conn, FALSE, TRUE); + } + + // Note: All of the code under this condition used to be just: + // + // load_class('Model', 'core'); + // + // However, load_class() instantiates classes + // to cache them for later use and that prevents + // MY_Model from being an abstract class and is + // sub-optimal otherwise anyway. + if ( ! class_exists('CI_Model', FALSE)) + { + $app_path = APPPATH.'core'.DIRECTORY_SEPARATOR; + if (file_exists($app_path.'Model.php')) + { + require_once($app_path.'Model.php'); + if ( ! class_exists('CI_Model', FALSE)) + { + throw new RuntimeException($app_path."Model.php exists, but doesn't declare class CI_Model"); + } + + log_message('info', 'CI_Model class loaded'); + } + elseif ( ! class_exists('CI_Model', FALSE)) + { + require_once(BASEPATH.'core'.DIRECTORY_SEPARATOR.'Model.php'); + } + + $class = config_item('subclass_prefix').'Model'; + if (file_exists($app_path.$class.'.php')) + { + require_once($app_path.$class.'.php'); + if ( ! class_exists($class, FALSE)) + { + throw new RuntimeException($app_path.$class.".php exists, but doesn't declare class ".$class); + } + + log_message('info', config_item('subclass_prefix').'Model class loaded'); + } + } + + $model = ucfirst($model); + if ( ! class_exists($model, FALSE)) + { + foreach ($this->_ci_model_paths as $mod_path) + { + if ( ! file_exists($mod_path.'models/'.$path.$model.'.php')) + { + continue; + } + + require_once($mod_path.'models/'.$path.$model.'.php'); + if ( ! class_exists($model, FALSE)) + { + throw new RuntimeException($mod_path."models/".$path.$model.".php exists, but doesn't declare class ".$model); + } + + break; + } + + if ( ! class_exists($model, FALSE)) + { + throw new RuntimeException('Unable to locate the model you have specified: '.$model); + } + } + elseif ( ! is_subclass_of($model, 'CI_Model')) + { + throw new RuntimeException("Class ".$model." already exists and doesn't extend CI_Model"); + } + + $this->_ci_models[] = $name; + $model = new $model(); + $CI->$name = $model; + log_message('info', 'Model "'.get_class($model).'" initialized'); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Database Loader + * + * @param mixed $params Database configuration options + * @param bool $return Whether to return the database object + * @param bool $query_builder Whether to enable Query Builder + * (overrides the configuration setting) + * + * @return object|bool Database object if $return is set to TRUE, + * FALSE on failure, CI_Loader instance in any other case + */ + public function database($params = '', $return = FALSE, $query_builder = NULL) + { + // Grab the super object + $CI =& get_instance(); + + // Do we even need to load the database class? + if ($return === FALSE && $query_builder === NULL && isset($CI->db) && is_object($CI->db) && ! empty($CI->db->conn_id)) + { + return FALSE; + } + + require_once(BASEPATH.'database/DB.php'); + + if ($return === TRUE) + { + return DB($params, $query_builder); + } + + // Initialize the db variable. Needed to prevent + // reference errors with some configurations + $CI->db = ''; + + // Load the DB class + $CI->db =& DB($params, $query_builder); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Load the Database Utilities Class + * + * @param object $db Database object + * @param bool $return Whether to return the DB Utilities class object or not + * @return object + */ + public function dbutil($db = NULL, $return = FALSE) + { + $CI =& get_instance(); + + if ( ! is_object($db) OR ! ($db instanceof CI_DB)) + { + class_exists('CI_DB', FALSE) OR $this->database(); + $db =& $CI->db; + } + + require_once(BASEPATH.'database/DB_utility.php'); + require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_utility.php'); + $class = 'CI_DB_'.$db->dbdriver.'_utility'; + + if ($return === TRUE) + { + return new $class($db); + } + + $CI->dbutil = new $class($db); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Load the Database Forge Class + * + * @param object $db Database object + * @param bool $return Whether to return the DB Forge class object or not + * @return object + */ + public function dbforge($db = NULL, $return = FALSE) + { + $CI =& get_instance(); + if ( ! is_object($db) OR ! ($db instanceof CI_DB)) + { + class_exists('CI_DB', FALSE) OR $this->database(); + $db =& $CI->db; + } + + require_once(BASEPATH.'database/DB_forge.php'); + require_once(BASEPATH.'database/drivers/'.$db->dbdriver.'/'.$db->dbdriver.'_forge.php'); + + if ( ! empty($db->subdriver)) + { + $driver_path = BASEPATH.'database/drivers/'.$db->dbdriver.'/subdrivers/'.$db->dbdriver.'_'.$db->subdriver.'_forge.php'; + if (file_exists($driver_path)) + { + require_once($driver_path); + $class = 'CI_DB_'.$db->dbdriver.'_'.$db->subdriver.'_forge'; + } + } + else + { + $class = 'CI_DB_'.$db->dbdriver.'_forge'; + } + + if ($return === TRUE) + { + return new $class($db); + } + + $CI->dbforge = new $class($db); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * View Loader + * + * Loads "view" files. + * + * @param string $view View name + * @param array $vars An associative array of data + * to be extracted for use in the view + * @param bool $return Whether to return the view output + * or leave it to the Output class + * @return object|string + */ + public function view($view, $vars = array(), $return = FALSE) + { + return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_prepare_view_vars($vars), '_ci_return' => $return)); + } + + // -------------------------------------------------------------------- + + /** + * Generic File Loader + * + * @param string $path File path + * @param bool $return Whether to return the file output + * @return object|string + */ + public function file($path, $return = FALSE) + { + return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return)); + } + + // -------------------------------------------------------------------- + + /** + * Set Variables + * + * Once variables are set they become available within + * the controller class and its "view" files. + * + * @param array|object|string $vars + * An associative array or object containing values + * to be set, or a value's name if string + * @param string $val Value to set, only used if $vars is a string + * @return object + */ + public function vars($vars, $val = '') + { + $vars = is_string($vars) + ? array($vars => $val) + : $this->_ci_prepare_view_vars($vars); + + foreach ($vars as $key => $val) + { + $this->_ci_cached_vars[$key] = $val; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Clear Cached Variables + * + * Clears the cached variables. + * + * @return CI_Loader + */ + public function clear_vars() + { + $this->_ci_cached_vars = array(); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get Variable + * + * Check if a variable is set and retrieve it. + * + * @param string $key Variable name + * @return mixed The variable or NULL if not found + */ + public function get_var($key) + { + return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL; + } + + // -------------------------------------------------------------------- + + /** + * Get Variables + * + * Retrieves all loaded variables. + * + * @return array + */ + public function get_vars() + { + return $this->_ci_cached_vars; + } + + // -------------------------------------------------------------------- + + /** + * Helper Loader + * + * @param string|string[] $helpers Helper name(s) + * @return object + */ + public function helper($helpers = array()) + { + is_array($helpers) OR $helpers = array($helpers); + foreach ($helpers as &$helper) + { + $filename = basename($helper); + $filepath = ($filename === $helper) ? '' : substr($helper, 0, strlen($helper) - strlen($filename)); + $filename = strtolower(preg_replace('#(_helper)?(\.php)?$#i', '', $filename)).'_helper'; + $helper = $filepath.$filename; + + if (isset($this->_ci_helpers[$helper])) + { + continue; + } + + // Is this a helper extension request? + $ext_helper = config_item('subclass_prefix').$filename; + $ext_loaded = FALSE; + foreach ($this->_ci_helper_paths as $path) + { + if (file_exists($path.'helpers/'.$ext_helper.'.php')) + { + include_once($path.'helpers/'.$ext_helper.'.php'); + $ext_loaded = TRUE; + } + } + + // If we have loaded extensions - check if the base one is here + if ($ext_loaded === TRUE) + { + $base_helper = BASEPATH.'helpers/'.$helper.'.php'; + if ( ! file_exists($base_helper)) + { + show_error('Unable to load the requested file: helpers/'.$helper.'.php'); + } + + include_once($base_helper); + $this->_ci_helpers[$helper] = TRUE; + log_message('info', 'Helper loaded: '.$helper); + continue; + } + + // No extensions found ... try loading regular helpers and/or overrides + foreach ($this->_ci_helper_paths as $path) + { + if (file_exists($path.'helpers/'.$helper.'.php')) + { + include_once($path.'helpers/'.$helper.'.php'); + + $this->_ci_helpers[$helper] = TRUE; + log_message('info', 'Helper loaded: '.$helper); + break; + } + } + + // unable to load the helper + if ( ! isset($this->_ci_helpers[$helper])) + { + show_error('Unable to load the requested file: helpers/'.$helper.'.php'); + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Load Helpers + * + * An alias for the helper() method in case the developer has + * written the plural form of it. + * + * @uses CI_Loader::helper() + * @param string|string[] $helpers Helper name(s) + * @return object + */ + public function helpers($helpers = array()) + { + return $this->helper($helpers); + } + + // -------------------------------------------------------------------- + + /** + * Language Loader + * + * Loads language files. + * + * @param string|string[] $files List of language file names to load + * @param string Language name + * @return object + */ + public function language($files, $lang = '') + { + get_instance()->lang->load($files, $lang); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Config Loader + * + * Loads a config file (an alias for CI_Config::load()). + * + * @uses CI_Config::load() + * @param string $file Configuration file name + * @param bool $use_sections Whether configuration values should be loaded into their own section + * @param bool $fail_gracefully Whether to just return FALSE or display an error message + * @return bool TRUE if the file was loaded correctly or FALSE on failure + */ + public function config($file, $use_sections = FALSE, $fail_gracefully = FALSE) + { + return get_instance()->config->load($file, $use_sections, $fail_gracefully); + } + + // -------------------------------------------------------------------- + + /** + * Driver Loader + * + * Loads a driver library. + * + * @param string|string[] $library Driver name(s) + * @param array $params Optional parameters to pass to the driver + * @param string $object_name An optional object name to assign to + * + * @return object|bool Object or FALSE on failure if $library is a string + * and $object_name is set. CI_Loader instance otherwise. + */ + public function driver($library, $params = NULL, $object_name = NULL) + { + if (is_array($library)) + { + foreach ($library as $key => $value) + { + if (is_int($key)) + { + $this->driver($value, $params); + } + else + { + $this->driver($key, $params, $value); + } + } + + return $this; + } + elseif (empty($library)) + { + return FALSE; + } + + if ( ! class_exists('CI_Driver_Library', FALSE)) + { + // We aren't instantiating an object here, just making the base class available + require BASEPATH.'libraries/Driver.php'; + } + + // We can save the loader some time since Drivers will *always* be in a subfolder, + // and typically identically named to the library + if ( ! strpos($library, '/')) + { + $library = ucfirst($library).'/'.$library; + } + + return $this->library($library, $params, $object_name); + } + + // -------------------------------------------------------------------- + + /** + * Add Package Path + * + * Prepends a parent path to the library, model, helper and config + * path arrays. + * + * @see CI_Loader::$_ci_library_paths + * @see CI_Loader::$_ci_model_paths + * @see CI_Loader::$_ci_helper_paths + * @see CI_Config::$_config_paths + * + * @param string $path Path to add + * @param bool $view_cascade (default: TRUE) + * @return object + */ + public function add_package_path($path, $view_cascade = TRUE) + { + $path = rtrim($path, '/').'/'; + + array_unshift($this->_ci_library_paths, $path); + array_unshift($this->_ci_model_paths, $path); + array_unshift($this->_ci_helper_paths, $path); + + $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths; + + // Add config file path + $config =& $this->_ci_get_component('config'); + $config->_config_paths[] = $path; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get Package Paths + * + * Return a list of all package paths. + * + * @param bool $include_base Whether to include BASEPATH (default: FALSE) + * @return array + */ + public function get_package_paths($include_base = FALSE) + { + return ($include_base === TRUE) ? $this->_ci_library_paths : $this->_ci_model_paths; + } + + // -------------------------------------------------------------------- + + /** + * Remove Package Path + * + * Remove a path from the library, model, helper and/or config + * path arrays if it exists. If no path is provided, the most recently + * added path will be removed removed. + * + * @param string $path Path to remove + * @return object + */ + public function remove_package_path($path = '') + { + $config =& $this->_ci_get_component('config'); + + if ($path === '') + { + array_shift($this->_ci_library_paths); + array_shift($this->_ci_model_paths); + array_shift($this->_ci_helper_paths); + array_shift($this->_ci_view_paths); + array_pop($config->_config_paths); + } + else + { + $path = rtrim($path, '/').'/'; + foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var) + { + if (($key = array_search($path, $this->{$var})) !== FALSE) + { + unset($this->{$var}[$key]); + } + } + + if (isset($this->_ci_view_paths[$path.'views/'])) + { + unset($this->_ci_view_paths[$path.'views/']); + } + + if (($key = array_search($path, $config->_config_paths)) !== FALSE) + { + unset($config->_config_paths[$key]); + } + } + + // make sure the application default paths are still in the array + $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH))); + $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH))); + $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH))); + $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE)); + $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH))); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Internal CI Data Loader + * + * Used to load views and files. + * + * Variables are prefixed with _ci_ to avoid symbol collision with + * variables made available to view files. + * + * @used-by CI_Loader::view() + * @used-by CI_Loader::file() + * @param array $_ci_data Data to load + * @return object + */ + protected function _ci_load($_ci_data) + { + // Set the default data variables + foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val) + { + $$_ci_val = isset($_ci_data[$_ci_val]) ? $_ci_data[$_ci_val] : FALSE; + } + + $file_exists = FALSE; + + // Set the path to the requested file + if (is_string($_ci_path) && $_ci_path !== '') + { + $_ci_x = explode('/', $_ci_path); + $_ci_file = end($_ci_x); + } + else + { + $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION); + $_ci_file = ($_ci_ext === '') ? $_ci_view.'.php' : $_ci_view; + + foreach ($this->_ci_view_paths as $_ci_view_file => $cascade) + { + if (file_exists($_ci_view_file.$_ci_file)) + { + $_ci_path = $_ci_view_file.$_ci_file; + $file_exists = TRUE; + break; + } + + if ( ! $cascade) + { + break; + } + } + } + + if ( ! $file_exists && ! file_exists($_ci_path)) + { + show_error('Unable to load the requested file: '.$_ci_file); + } + + // This allows anything loaded using $this->load (views, files, etc.) + // to become accessible from within the Controller and Model functions. + $_ci_CI =& get_instance(); + foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var) + { + if ( ! isset($this->$_ci_key)) + { + $this->$_ci_key =& $_ci_CI->$_ci_key; + } + } + + /* + * Extract and cache variables + * + * You can either set variables using the dedicated $this->load->vars() + * function or via the second parameter of this function. We'll merge + * the two types and cache them so that views that are embedded within + * other views can have access to these variables. + */ + empty($_ci_vars) OR $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars); + extract($this->_ci_cached_vars); + + /* + * Buffer the output + * + * We buffer the output for two reasons: + * 1. Speed. You get a significant speed boost. + * 2. So that the final rendered template can be post-processed by + * the output class. Why do we need post processing? For one thing, + * in order to show the elapsed page load time. Unless we can + * intercept the content right before it's sent to the browser and + * then stop the timer it won't be accurate. + */ + ob_start(); + + // If the PHP installation does not support short tags we'll + // do a little string replacement, changing the short tags + // to standard PHP echo statements. + if ( ! is_php('5.4') && ! ini_get('short_open_tag') && config_item('rewrite_short_tags') === TRUE) + { + echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace(' $this->_ci_ob_level + 1) + { + ob_end_flush(); + } + else + { + $_ci_CI->output->append_output(ob_get_contents()); + @ob_end_clean(); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Internal CI Library Loader + * + * @used-by CI_Loader::library() + * @uses CI_Loader::_ci_init_library() + * + * @param string $class Class name to load + * @param mixed $params Optional parameters to pass to the class constructor + * @param string $object_name Optional object name to assign to + * @return void + */ + protected function _ci_load_library($class, $params = NULL, $object_name = NULL) + { + // Get the class name, and while we're at it trim any slashes. + // The directory path can be included as part of the class name, + // but we don't want a leading slash + $class = str_replace('.php', '', trim($class, '/')); + + // Was the path included with the class name? + // We look for a slash to determine this + if (($last_slash = strrpos($class, '/')) !== FALSE) + { + // Extract the path + $subdir = substr($class, 0, ++$last_slash); + + // Get the filename from the path + $class = substr($class, $last_slash); + } + else + { + $subdir = ''; + } + + $class = ucfirst($class); + + // Is this a stock library? There are a few special conditions if so ... + if (file_exists(BASEPATH.'libraries/'.$subdir.$class.'.php')) + { + return $this->_ci_load_stock_library($class, $subdir, $params, $object_name); + } + + // Safety: Was the class already loaded by a previous call? + if (class_exists($class, FALSE)) + { + $property = $object_name; + if (empty($property)) + { + $property = strtolower($class); + isset($this->_ci_varmap[$property]) && $property = $this->_ci_varmap[$property]; + } + + $CI =& get_instance(); + if (isset($CI->$property)) + { + log_message('debug', $class.' class already loaded. Second attempt ignored.'); + return; + } + + return $this->_ci_init_library($class, '', $params, $object_name); + } + + // Let's search for the requested library file and load it. + foreach ($this->_ci_library_paths as $path) + { + // BASEPATH has already been checked for + if ($path === BASEPATH) + { + continue; + } + + $filepath = $path.'libraries/'.$subdir.$class.'.php'; + // Does the file exist? No? Bummer... + if ( ! file_exists($filepath)) + { + continue; + } + + include_once($filepath); + return $this->_ci_init_library($class, '', $params, $object_name); + } + + // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified? + if ($subdir === '') + { + return $this->_ci_load_library($class.'/'.$class, $params, $object_name); + } + + // If we got this far we were unable to find the requested class. + log_message('error', 'Unable to load the requested class: '.$class); + show_error('Unable to load the requested class: '.$class); + } + + // -------------------------------------------------------------------- + + /** + * Internal CI Stock Library Loader + * + * @used-by CI_Loader::_ci_load_library() + * @uses CI_Loader::_ci_init_library() + * + * @param string $library_name Library name to load + * @param string $file_path Path to the library filename, relative to libraries/ + * @param mixed $params Optional parameters to pass to the class constructor + * @param string $object_name Optional object name to assign to + * @return void + */ + protected function _ci_load_stock_library($library_name, $file_path, $params, $object_name) + { + $prefix = 'CI_'; + + if (class_exists($prefix.$library_name, FALSE)) + { + if (class_exists(config_item('subclass_prefix').$library_name, FALSE)) + { + $prefix = config_item('subclass_prefix'); + } + + $property = $object_name; + if (empty($property)) + { + $property = strtolower($library_name); + isset($this->_ci_varmap[$property]) && $property = $this->_ci_varmap[$property]; + } + + $CI =& get_instance(); + if ( ! isset($CI->$property)) + { + return $this->_ci_init_library($library_name, $prefix, $params, $object_name); + } + + log_message('debug', $library_name.' class already loaded. Second attempt ignored.'); + return; + } + + $paths = $this->_ci_library_paths; + array_pop($paths); // BASEPATH + array_pop($paths); // APPPATH (needs to be the first path checked) + array_unshift($paths, APPPATH); + + foreach ($paths as $path) + { + if (file_exists($path = $path.'libraries/'.$file_path.$library_name.'.php')) + { + // Override + include_once($path); + if (class_exists($prefix.$library_name, FALSE)) + { + return $this->_ci_init_library($library_name, $prefix, $params, $object_name); + } + + log_message('debug', $path.' exists, but does not declare '.$prefix.$library_name); + } + } + + include_once(BASEPATH.'libraries/'.$file_path.$library_name.'.php'); + + // Check for extensions + $subclass = config_item('subclass_prefix').$library_name; + foreach ($paths as $path) + { + if (file_exists($path = $path.'libraries/'.$file_path.$subclass.'.php')) + { + include_once($path); + if (class_exists($subclass, FALSE)) + { + $prefix = config_item('subclass_prefix'); + break; + } + + log_message('debug', $path.' exists, but does not declare '.$subclass); + } + } + + return $this->_ci_init_library($library_name, $prefix, $params, $object_name); + } + + // -------------------------------------------------------------------- + + /** + * Internal CI Library Instantiator + * + * @used-by CI_Loader::_ci_load_stock_library() + * @used-by CI_Loader::_ci_load_library() + * + * @param string $class Class name + * @param string $prefix Class name prefix + * @param array|null|bool $config Optional configuration to pass to the class constructor: + * FALSE to skip; + * NULL to search in config paths; + * array containing configuration data + * @param string $object_name Optional object name to assign to + * @return void + */ + protected function _ci_init_library($class, $prefix, $config = FALSE, $object_name = NULL) + { + // Is there an associated config file for this class? Note: these should always be lowercase + if ($config === NULL) + { + // Fetch the config paths containing any package paths + $config_component = $this->_ci_get_component('config'); + + if (is_array($config_component->_config_paths)) + { + $found = FALSE; + foreach ($config_component->_config_paths as $path) + { + // We test for both uppercase and lowercase, for servers that + // are case-sensitive with regard to file names. Load global first, + // override with environment next + if (file_exists($path.'config/'.strtolower($class).'.php')) + { + include($path.'config/'.strtolower($class).'.php'); + $found = TRUE; + } + elseif (file_exists($path.'config/'.ucfirst(strtolower($class)).'.php')) + { + include($path.'config/'.ucfirst(strtolower($class)).'.php'); + $found = TRUE; + } + + if (file_exists($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php')) + { + include($path.'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'); + $found = TRUE; + } + elseif (file_exists($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php')) + { + include($path.'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'); + $found = TRUE; + } + + // Break on the first found configuration, thus package + // files are not overridden by default paths + if ($found === TRUE) + { + break; + } + } + } + } + + $class_name = $prefix.$class; + + // Is the class name valid? + if ( ! class_exists($class_name, FALSE)) + { + log_message('error', 'Non-existent class: '.$class_name); + show_error('Non-existent class: '.$class_name); + } + + // Set the variable name we will assign the class to + // Was a custom class name supplied? If so we'll use it + if (empty($object_name)) + { + $object_name = strtolower($class); + if (isset($this->_ci_varmap[$object_name])) + { + $object_name = $this->_ci_varmap[$object_name]; + } + } + + // Don't overwrite existing properties + $CI =& get_instance(); + if (isset($CI->$object_name)) + { + if ($CI->$object_name instanceof $class_name) + { + log_message('debug', $class_name." has already been instantiated as '".$object_name."'. Second attempt aborted."); + return; + } + + show_error("Resource '".$object_name."' already exists and is not a ".$class_name." instance."); + } + + // Save the class name and object name + $this->_ci_classes[$object_name] = $class; + + // Instantiate the class + $CI->$object_name = isset($config) + ? new $class_name($config) + : new $class_name(); + } + + // -------------------------------------------------------------------- + + /** + * CI Autoloader + * + * Loads component listed in the config/autoload.php file. + * + * @used-by CI_Loader::initialize() + * @return void + */ + protected function _ci_autoloader() + { + if (file_exists(APPPATH.'config/autoload.php')) + { + include(APPPATH.'config/autoload.php'); + } + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'); + } + + if ( ! isset($autoload)) + { + return; + } + + // Autoload packages + if (isset($autoload['packages'])) + { + foreach ($autoload['packages'] as $package_path) + { + $this->add_package_path($package_path); + } + } + + // Load any custom config file + if (count($autoload['config']) > 0) + { + foreach ($autoload['config'] as $val) + { + $this->config($val); + } + } + + // Autoload helpers and languages + foreach (array('helper', 'language') as $type) + { + if (isset($autoload[$type]) && count($autoload[$type]) > 0) + { + $this->$type($autoload[$type]); + } + } + + // Autoload drivers + if (isset($autoload['drivers'])) + { + $this->driver($autoload['drivers']); + } + + // Load libraries + if (isset($autoload['libraries']) && count($autoload['libraries']) > 0) + { + // Load the database driver. + if (in_array('database', $autoload['libraries'])) + { + $this->database(); + $autoload['libraries'] = array_diff($autoload['libraries'], array('database')); + } + + // Load all other libraries + $this->library($autoload['libraries']); + } + + // Autoload models + if (isset($autoload['model'])) + { + $this->model($autoload['model']); + } + } + + // -------------------------------------------------------------------- + + /** + * Prepare variables for _ci_vars, to be later extract()-ed inside views + * + * Converts objects to associative arrays and filters-out internal + * variable names (i.e. keys prefixed with '_ci_'). + * + * @param mixed $vars + * @return array + */ + protected function _ci_prepare_view_vars($vars) + { + if ( ! is_array($vars)) + { + $vars = is_object($vars) + ? get_object_vars($vars) + : array(); + } + + foreach (array_keys($vars) as $key) + { + if (strncmp($key, '_ci_', 4) === 0) + { + unset($vars[$key]); + } + } + + return $vars; + } + + // -------------------------------------------------------------------- + + /** + * CI Component getter + * + * Get a reference to a specific library or model. + * + * @param string $component Component name + * @return bool + */ + protected function &_ci_get_component($component) + { + $CI =& get_instance(); + return $CI->$component; + } +} diff --git a/system/core/Log.php b/system/core/Log.php new file mode 100644 index 0000000..a2b464c --- /dev/null +++ b/system/core/Log.php @@ -0,0 +1,296 @@ + 1, 'DEBUG' => 2, 'INFO' => 3, 'ALL' => 4); + + /** + * mbstring.func_overload flag + * + * @var bool + */ + protected static $func_overload; + + // -------------------------------------------------------------------- + + /** + * Class constructor + * + * @return void + */ + public function __construct() + { + $config =& get_config(); + + isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); + + $this->_log_path = ($config['log_path'] !== '') ? $config['log_path'] : APPPATH.'logs/'; + $this->_file_ext = (isset($config['log_file_extension']) && $config['log_file_extension'] !== '') + ? ltrim($config['log_file_extension'], '.') : 'php'; + + file_exists($this->_log_path) OR mkdir($this->_log_path, 0755, TRUE); + + if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path)) + { + $this->_enabled = FALSE; + } + + if (is_numeric($config['log_threshold'])) + { + $this->_threshold = (int) $config['log_threshold']; + } + elseif (is_array($config['log_threshold'])) + { + $this->_threshold = 0; + $this->_threshold_array = array_flip($config['log_threshold']); + } + + if ( ! empty($config['log_date_format'])) + { + $this->_date_fmt = $config['log_date_format']; + } + + if ( ! empty($config['log_file_permissions']) && is_int($config['log_file_permissions'])) + { + $this->_file_permissions = $config['log_file_permissions']; + } + } + + // -------------------------------------------------------------------- + + /** + * Write Log File + * + * Generally this function will be called using the global log_message() function + * + * @param string $level The error level: 'error', 'debug' or 'info' + * @param string $msg The error message + * @return bool + */ + public function write_log($level, $msg) + { + if ($this->_enabled === FALSE) + { + return FALSE; + } + + $level = strtoupper($level); + + if (( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold)) + && ! isset($this->_threshold_array[$this->_levels[$level]])) + { + return FALSE; + } + + $filepath = $this->_log_path.'log-'.date('Y-m-d').'.'.$this->_file_ext; + $message = ''; + + if ( ! file_exists($filepath)) + { + $newfile = TRUE; + // Only add protection to php files + if ($this->_file_ext === 'php') + { + $message .= "\n\n"; + } + } + + if ( ! $fp = @fopen($filepath, 'ab')) + { + return FALSE; + } + + flock($fp, LOCK_EX); + + // Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format + if (strpos($this->_date_fmt, 'u') !== FALSE) + { + $microtime_full = microtime(TRUE); + $microtime_short = sprintf("%06d", ($microtime_full - floor($microtime_full)) * 1000000); + $date = new DateTime(date('Y-m-d H:i:s.'.$microtime_short, $microtime_full)); + $date = $date->format($this->_date_fmt); + } + else + { + $date = date($this->_date_fmt); + } + + $message .= $this->_format_line($level, $date, $msg); + + for ($written = 0, $length = self::strlen($message); $written < $length; $written += $result) + { + if (($result = fwrite($fp, self::substr($message, $written))) === FALSE) + { + break; + } + } + + flock($fp, LOCK_UN); + fclose($fp); + + if (isset($newfile) && $newfile === TRUE) + { + chmod($filepath, $this->_file_permissions); + } + + return is_int($result); + } + + // -------------------------------------------------------------------- + + /** + * Format the log line. + * + * This is for extensibility of log formatting + * If you want to change the log format, extend the CI_Log class and override this method + * + * @param string $level The error level + * @param string $date Formatted date string + * @param string $message The log message + * @return string Formatted log line with a new line character '\n' at the end + */ + protected function _format_line($level, $date, $message) + { + return $level.' - '.$date.' --> '.$message."\n"; + } + + // -------------------------------------------------------------------- + + /** + * Byte-safe strlen() + * + * @param string $str + * @return int + */ + protected static function strlen($str) + { + return (self::$func_overload) + ? mb_strlen($str, '8bit') + : strlen($str); + } + + // -------------------------------------------------------------------- + + /** + * Byte-safe substr() + * + * @param string $str + * @param int $start + * @param int $length + * @return string + */ + protected static function substr($str, $start, $length = NULL) + { + if (self::$func_overload) + { + // mb_substr($str, $start, null, '8bit') returns an empty + // string on PHP 5.3 + isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); + return mb_substr($str, $start, $length, '8bit'); + } + + return isset($length) + ? substr($str, $start, $length) + : substr($str, $start); + } +} diff --git a/system/core/Model.php b/system/core/Model.php new file mode 100644 index 0000000..dd11dd2 --- /dev/null +++ b/system/core/Model.php @@ -0,0 +1,76 @@ +$key; + } + +} diff --git a/system/core/Output.php b/system/core/Output.php new file mode 100644 index 0000000..3cda062 --- /dev/null +++ b/system/core/Output.php @@ -0,0 +1,842 @@ +_zlib_oc = (bool) ini_get('zlib.output_compression'); + $this->_compress_output = ( + $this->_zlib_oc === FALSE + && config_item('compress_output') === TRUE + && extension_loaded('zlib') + ); + + isset(self::$func_overload) OR self::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); + + // Get mime types for later + $this->mimes =& get_mimes(); + + log_message('info', 'Output Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Get Output + * + * Returns the current output string. + * + * @return string + */ + public function get_output() + { + return $this->final_output; + } + + // -------------------------------------------------------------------- + + /** + * Set Output + * + * Sets the output string. + * + * @param string $output Output data + * @return CI_Output + */ + public function set_output($output) + { + $this->final_output = $output; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Append Output + * + * Appends data onto the output string. + * + * @param string $output Data to append + * @return CI_Output + */ + public function append_output($output) + { + $this->final_output .= $output; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Header + * + * Lets you set a server header which will be sent with the final output. + * + * Note: If a file is cached, headers will not be sent. + * @todo We need to figure out how to permit headers to be cached. + * + * @param string $header Header + * @param bool $replace Whether to replace the old header value, if already set + * @return CI_Output + */ + public function set_header($header, $replace = TRUE) + { + // If zlib.output_compression is enabled it will compress the output, + // but it will not modify the content-length header to compensate for + // the reduction, causing the browser to hang waiting for more data. + // We'll just skip content-length in those cases. + if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) === 0) + { + return $this; + } + + $this->headers[] = array($header, $replace); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Content-Type Header + * + * @param string $mime_type Extension of the file we're outputting + * @param string $charset Character set (default: NULL) + * @return CI_Output + */ + public function set_content_type($mime_type, $charset = NULL) + { + if (strpos($mime_type, '/') === FALSE) + { + $extension = ltrim($mime_type, '.'); + + // Is this extension supported? + if (isset($this->mimes[$extension])) + { + $mime_type =& $this->mimes[$extension]; + + if (is_array($mime_type)) + { + $mime_type = current($mime_type); + } + } + } + + $this->mime_type = $mime_type; + + if (empty($charset)) + { + $charset = config_item('charset'); + } + + $header = 'Content-Type: '.$mime_type + .(empty($charset) ? '' : '; charset='.$charset); + + $this->headers[] = array($header, TRUE); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get Current Content-Type Header + * + * @return string 'text/html', if not already set + */ + public function get_content_type() + { + for ($i = 0, $c = count($this->headers); $i < $c; $i++) + { + if (sscanf($this->headers[$i][0], 'Content-Type: %[^;]', $content_type) === 1) + { + return $content_type; + } + } + + return 'text/html'; + } + + // -------------------------------------------------------------------- + + /** + * Get Header + * + * @param string $header + * @return string + */ + public function get_header($header) + { + // Combine headers already sent with our batched headers + $headers = array_merge( + // We only need [x][0] from our multi-dimensional array + array_map('array_shift', $this->headers), + headers_list() + ); + + if (empty($headers) OR empty($header)) + { + return NULL; + } + + // Count backwards, in order to get the last matching header + for ($c = count($headers) - 1; $c > -1; $c--) + { + if (strncasecmp($header, $headers[$c], $l = self::strlen($header)) === 0) + { + return trim(self::substr($headers[$c], $l+1)); + } + } + + return NULL; + } + + // -------------------------------------------------------------------- + + /** + * Set HTTP Status Header + * + * As of version 1.7.2, this is an alias for common function + * set_status_header(). + * + * @param int $code Status code (default: 200) + * @param string $text Optional message + * @return CI_Output + */ + public function set_status_header($code = 200, $text = '') + { + set_status_header($code, $text); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Enable/disable Profiler + * + * @param bool $val TRUE to enable or FALSE to disable + * @return CI_Output + */ + public function enable_profiler($val = TRUE) + { + $this->enable_profiler = is_bool($val) ? $val : TRUE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Profiler Sections + * + * Allows override of default/config settings for + * Profiler section display. + * + * @param array $sections Profiler sections + * @return CI_Output + */ + public function set_profiler_sections($sections) + { + if (isset($sections['query_toggle_count'])) + { + $this->_profiler_sections['query_toggle_count'] = (int) $sections['query_toggle_count']; + unset($sections['query_toggle_count']); + } + + foreach ($sections as $section => $enable) + { + $this->_profiler_sections[$section] = ($enable !== FALSE); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Cache + * + * @param int $time Cache expiration time in minutes + * @return CI_Output + */ + public function cache($time) + { + $this->cache_expiration = is_numeric($time) ? $time : 0; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Display Output + * + * Processes and sends finalized output data to the browser along + * with any server headers and profile data. It also stops benchmark + * timers so the page rendering speed and memory usage can be shown. + * + * Note: All "view" data is automatically put into $this->final_output + * by controller class. + * + * @uses CI_Output::$final_output + * @param string $output Output data override + * @return void + */ + public function _display($output = '') + { + // Note: We use load_class() because we can't use $CI =& get_instance() + // since this function is sometimes called by the caching mechanism, + // which happens before the CI super object is available. + $BM =& load_class('Benchmark', 'core'); + $CFG =& load_class('Config', 'core'); + + // Grab the super object if we can. + if (class_exists('CI_Controller', FALSE)) + { + $CI =& get_instance(); + } + + // -------------------------------------------------------------------- + + // Set the output data + if ($output === '') + { + $output =& $this->final_output; + } + + // -------------------------------------------------------------------- + + // Do we need to write a cache file? Only if the controller does not have its + // own _output() method and we are not dealing with a cache file, which we + // can determine by the existence of the $CI object above + if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output')) + { + $this->_write_cache($output); + } + + // -------------------------------------------------------------------- + + // Parse out the elapsed time and memory usage, + // then swap the pseudo-variables with the data + + $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); + + if ($this->parse_exec_vars === TRUE) + { + $memory = round(memory_get_usage() / 1024 / 1024, 2).'MB'; + $output = str_replace(array('{elapsed_time}', '{memory_usage}'), array($elapsed, $memory), $output); + } + + // -------------------------------------------------------------------- + + // Is compression requested? + if (isset($CI) // This means that we're not serving a cache file, if we were, it would already be compressed + && $this->_compress_output === TRUE + && isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) + { + ob_start('ob_gzhandler'); + } + + // -------------------------------------------------------------------- + + // Are there any server headers to send? + if (count($this->headers) > 0) + { + foreach ($this->headers as $header) + { + @header($header[0], $header[1]); + } + } + + // -------------------------------------------------------------------- + + // Does the $CI object exist? + // If not we know we are dealing with a cache file so we'll + // simply echo out the data and exit. + if ( ! isset($CI)) + { + if ($this->_compress_output === TRUE) + { + if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) + { + header('Content-Encoding: gzip'); + header('Content-Length: '.self::strlen($output)); + } + else + { + // User agent doesn't support gzip compression, + // so we'll have to decompress our cache + $output = gzinflate(self::substr($output, 10, -8)); + } + } + + echo $output; + log_message('info', 'Final output sent to browser'); + log_message('debug', 'Total execution time: '.$elapsed); + return; + } + + // -------------------------------------------------------------------- + + // Do we need to generate profile data? + // If so, load the Profile class and run it. + if ($this->enable_profiler === TRUE) + { + $CI->load->library('profiler'); + if ( ! empty($this->_profiler_sections)) + { + $CI->profiler->set_sections($this->_profiler_sections); + } + + // If the output data contains closing and tags + // we will remove them and add them back after we insert the profile data + $output = preg_replace('|.*?|is', '', $output, -1, $count).$CI->profiler->run(); + if ($count > 0) + { + $output .= ''; + } + } + + // Does the controller contain a function named _output()? + // If so send the output there. Otherwise, echo it. + if (method_exists($CI, '_output')) + { + $CI->_output($output); + } + else + { + echo $output; // Send it to the browser! + } + + log_message('info', 'Final output sent to browser'); + log_message('debug', 'Total execution time: '.$elapsed); + } + + // -------------------------------------------------------------------- + + /** + * Write Cache + * + * @param string $output Output data to cache + * @return void + */ + public function _write_cache($output) + { + $CI =& get_instance(); + $path = $CI->config->item('cache_path'); + $cache_path = ($path === '') ? APPPATH.'cache/' : $path; + + if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) + { + log_message('error', 'Unable to write cache file: '.$cache_path); + return; + } + + $uri = $CI->config->item('base_url') + .$CI->config->item('index_page') + .$CI->uri->uri_string(); + + if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) + { + if (is_array($cache_query_string)) + { + $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); + } + else + { + $uri .= '?'.$_SERVER['QUERY_STRING']; + } + } + + $cache_path .= md5($uri); + + if ( ! $fp = @fopen($cache_path, 'w+b')) + { + log_message('error', 'Unable to write cache file: '.$cache_path); + return; + } + + if ( ! flock($fp, LOCK_EX)) + { + log_message('error', 'Unable to secure a file lock for file at: '.$cache_path); + fclose($fp); + return; + } + + // If output compression is enabled, compress the cache + // itself, so that we don't have to do that each time + // we're serving it + if ($this->_compress_output === TRUE) + { + $output = gzencode($output); + + if ($this->get_header('content-type') === NULL) + { + $this->set_content_type($this->mime_type); + } + } + + $expire = time() + ($this->cache_expiration * 60); + + // Put together our serialized info. + $cache_info = serialize(array( + 'expire' => $expire, + 'headers' => $this->headers + )); + + $output = $cache_info.'ENDCI--->'.$output; + + for ($written = 0, $length = self::strlen($output); $written < $length; $written += $result) + { + if (($result = fwrite($fp, self::substr($output, $written))) === FALSE) + { + break; + } + } + + flock($fp, LOCK_UN); + fclose($fp); + + if ( ! is_int($result)) + { + @unlink($cache_path); + log_message('error', 'Unable to write the complete cache content at: '.$cache_path); + return; + } + + chmod($cache_path, 0640); + log_message('debug', 'Cache file written: '.$cache_path); + + // Send HTTP cache-control headers to browser to match file cache settings. + $this->set_cache_header($_SERVER['REQUEST_TIME'], $expire); + } + + // -------------------------------------------------------------------- + + /** + * Update/serve cached output + * + * @uses CI_Config + * @uses CI_URI + * + * @param object &$CFG CI_Config class instance + * @param object &$URI CI_URI class instance + * @return bool TRUE on success or FALSE on failure + */ + public function _display_cache(&$CFG, &$URI) + { + $cache_path = ($CFG->item('cache_path') === '') ? APPPATH.'cache/' : $CFG->item('cache_path'); + + // Build the file path. The file name is an MD5 hash of the full URI + $uri = $CFG->item('base_url').$CFG->item('index_page').$URI->uri_string; + + if (($cache_query_string = $CFG->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) + { + if (is_array($cache_query_string)) + { + $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); + } + else + { + $uri .= '?'.$_SERVER['QUERY_STRING']; + } + } + + $filepath = $cache_path.md5($uri); + + if ( ! file_exists($filepath) OR ! $fp = @fopen($filepath, 'rb')) + { + return FALSE; + } + + flock($fp, LOCK_SH); + + $cache = (filesize($filepath) > 0) ? fread($fp, filesize($filepath)) : ''; + + flock($fp, LOCK_UN); + fclose($fp); + + // Look for embedded serialized file info. + if ( ! preg_match('/^(.*)ENDCI--->/', $cache, $match)) + { + return FALSE; + } + + $cache_info = unserialize($match[1]); + $expire = $cache_info['expire']; + + $last_modified = filemtime($filepath); + + // Has the file expired? + if ($_SERVER['REQUEST_TIME'] >= $expire && is_really_writable($cache_path)) + { + // If so we'll delete it. + @unlink($filepath); + log_message('debug', 'Cache file has expired. File deleted.'); + return FALSE; + } + + // Send the HTTP cache control headers + $this->set_cache_header($last_modified, $expire); + + // Add headers from cache file. + foreach ($cache_info['headers'] as $header) + { + $this->set_header($header[0], $header[1]); + } + + // Display the cache + $this->_display(self::substr($cache, self::strlen($match[0]))); + log_message('debug', 'Cache file is current. Sending it to browser.'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Delete cache + * + * @param string $uri URI string + * @return bool + */ + public function delete_cache($uri = '') + { + $CI =& get_instance(); + $cache_path = $CI->config->item('cache_path'); + if ($cache_path === '') + { + $cache_path = APPPATH.'cache/'; + } + + if ( ! is_dir($cache_path)) + { + log_message('error', 'Unable to find cache path: '.$cache_path); + return FALSE; + } + + if (empty($uri)) + { + $uri = $CI->uri->uri_string(); + + if (($cache_query_string = $CI->config->item('cache_query_string')) && ! empty($_SERVER['QUERY_STRING'])) + { + if (is_array($cache_query_string)) + { + $uri .= '?'.http_build_query(array_intersect_key($_GET, array_flip($cache_query_string))); + } + else + { + $uri .= '?'.$_SERVER['QUERY_STRING']; + } + } + } + + $cache_path .= md5($CI->config->item('base_url').$CI->config->item('index_page').ltrim($uri, '/')); + + if ( ! @unlink($cache_path)) + { + log_message('error', 'Unable to delete cache file for '.$uri); + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set Cache Header + * + * Set the HTTP headers to match the server-side file cache settings + * in order to reduce bandwidth. + * + * @param int $last_modified Timestamp of when the page was last modified + * @param int $expiration Timestamp of when should the requested page expire from cache + * @return void + */ + public function set_cache_header($last_modified, $expiration) + { + $max_age = $expiration - $_SERVER['REQUEST_TIME']; + + if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $last_modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) + { + $this->set_status_header(304); + exit; + } + + header('Pragma: public'); + header('Cache-Control: max-age='.$max_age.', public'); + header('Expires: '.gmdate('D, d M Y H:i:s', $expiration).' GMT'); + header('Last-modified: '.gmdate('D, d M Y H:i:s', $last_modified).' GMT'); + } + + // -------------------------------------------------------------------- + + /** + * Byte-safe strlen() + * + * @param string $str + * @return int + */ + protected static function strlen($str) + { + return (self::$func_overload) + ? mb_strlen($str, '8bit') + : strlen($str); + } + + // -------------------------------------------------------------------- + + /** + * Byte-safe substr() + * + * @param string $str + * @param int $start + * @param int $length + * @return string + */ + protected static function substr($str, $start, $length = NULL) + { + if (self::$func_overload) + { + // mb_substr($str, $start, null, '8bit') returns an empty + // string on PHP 5.3 + isset($length) OR $length = ($start >= 0 ? self::strlen($str) - $start : -$start); + return mb_substr($str, $start, $length, '8bit'); + } + + return isset($length) + ? substr($str, $start, $length) + : substr($str, $start); + } +} diff --git a/system/core/Router.php b/system/core/Router.php new file mode 100644 index 0000000..7b92f70 --- /dev/null +++ b/system/core/Router.php @@ -0,0 +1,515 @@ +config =& load_class('Config', 'core'); + $this->uri =& load_class('URI', 'core'); + + $this->enable_query_strings = ( ! is_cli() && $this->config->item('enable_query_strings') === TRUE); + + // If a directory override is configured, it has to be set before any dynamic routing logic + is_array($routing) && isset($routing['directory']) && $this->set_directory($routing['directory']); + $this->_set_routing(); + + // Set any routing overrides that may exist in the main index file + if (is_array($routing)) + { + empty($routing['controller']) OR $this->set_class($routing['controller']); + empty($routing['function']) OR $this->set_method($routing['function']); + } + + log_message('info', 'Router Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Set route mapping + * + * Determines what should be served based on the URI request, + * as well as any "routes" that have been set in the routing config file. + * + * @return void + */ + protected function _set_routing() + { + // Load the routes.php file. It would be great if we could + // skip this for enable_query_strings = TRUE, but then + // default_controller would be empty ... + if (file_exists(APPPATH.'config/routes.php')) + { + include(APPPATH.'config/routes.php'); + } + + if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); + } + + // Validate & get reserved routes + if (isset($route) && is_array($route)) + { + isset($route['default_controller']) && $this->default_controller = $route['default_controller']; + isset($route['translate_uri_dashes']) && $this->translate_uri_dashes = $route['translate_uri_dashes']; + unset($route['default_controller'], $route['translate_uri_dashes']); + $this->routes = $route; + } + + // Are query strings enabled in the config file? Normally CI doesn't utilize query strings + // since URI segments are more search-engine friendly, but they can optionally be used. + // If this feature is enabled, we will gather the directory/class/method a little differently + if ($this->enable_query_strings) + { + // If the directory is set at this time, it means an override exists, so skip the checks + if ( ! isset($this->directory)) + { + $_d = $this->config->item('directory_trigger'); + $_d = isset($_GET[$_d]) ? trim($_GET[$_d], " \t\n\r\0\x0B/") : ''; + + if ($_d !== '') + { + $this->uri->filter_uri($_d); + $this->set_directory($_d); + } + } + + $_c = trim($this->config->item('controller_trigger')); + if ( ! empty($_GET[$_c])) + { + $this->uri->filter_uri($_GET[$_c]); + $this->set_class($_GET[$_c]); + + $_f = trim($this->config->item('function_trigger')); + if ( ! empty($_GET[$_f])) + { + $this->uri->filter_uri($_GET[$_f]); + $this->set_method($_GET[$_f]); + } + + $this->uri->rsegments = array( + 1 => $this->class, + 2 => $this->method + ); + } + else + { + $this->_set_default_controller(); + } + + // Routing rules don't apply to query strings and we don't need to detect + // directories, so we're done here + return; + } + + // Is there anything to parse? + if ($this->uri->uri_string !== '') + { + $this->_parse_routes(); + } + else + { + $this->_set_default_controller(); + } + } + + // -------------------------------------------------------------------- + + /** + * Set request route + * + * Takes an array of URI segments as input and sets the class/method + * to be called. + * + * @used-by CI_Router::_parse_routes() + * @param array $segments URI segments + * @return void + */ + protected function _set_request($segments = array()) + { + $segments = $this->_validate_request($segments); + // If we don't have any segments left - try the default controller; + // WARNING: Directories get shifted out of the segments array! + if (empty($segments)) + { + $this->_set_default_controller(); + return; + } + + if ($this->translate_uri_dashes === TRUE) + { + $segments[0] = str_replace('-', '_', $segments[0]); + if (isset($segments[1])) + { + $segments[1] = str_replace('-', '_', $segments[1]); + } + } + + $this->set_class($segments[0]); + if (isset($segments[1])) + { + $this->set_method($segments[1]); + } + else + { + $segments[1] = 'index'; + } + + array_unshift($segments, NULL); + unset($segments[0]); + $this->uri->rsegments = $segments; + } + + // -------------------------------------------------------------------- + + /** + * Set default controller + * + * @return void + */ + protected function _set_default_controller() + { + if (empty($this->default_controller)) + { + show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.'); + } + + // Is the method being specified? + if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) + { + $method = 'index'; + } + + if ( ! file_exists(APPPATH.'controllers/'.$this->directory.ucfirst($class).'.php')) + { + // This will trigger 404 later + return; + } + + $this->set_class($class); + $this->set_method($method); + + // Assign routed segments, index starting from 1 + $this->uri->rsegments = array( + 1 => $class, + 2 => $method + ); + + log_message('debug', 'No URI present. Default controller set.'); + } + + // -------------------------------------------------------------------- + + /** + * Validate request + * + * Attempts validate the URI request and determine the controller path. + * + * @used-by CI_Router::_set_request() + * @param array $segments URI segments + * @return mixed URI segments + */ + protected function _validate_request($segments) + { + $c = count($segments); + $directory_override = isset($this->directory); + + // Loop through our segments and return as soon as a controller + // is found or when such a directory doesn't exist + while ($c-- > 0) + { + $test = $this->directory + .ucfirst($this->translate_uri_dashes === TRUE ? str_replace('-', '_', $segments[0]) : $segments[0]); + + if ( ! file_exists(APPPATH.'controllers/'.$test.'.php') + && $directory_override === FALSE + && is_dir(APPPATH.'controllers/'.$this->directory.$segments[0]) + ) + { + $this->set_directory(array_shift($segments), TRUE); + continue; + } + + return $segments; + } + + // This means that all segments were actually directories + return $segments; + } + + // -------------------------------------------------------------------- + + /** + * Parse Routes + * + * Matches any routes that may exist in the config/routes.php file + * against the URI to determine if the class/method need to be remapped. + * + * @return void + */ + protected function _parse_routes() + { + // Turn the segment array into a URI string + $uri = implode('/', $this->uri->segments); + + // Get HTTP verb + $http_verb = isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : 'cli'; + + // Loop through the route array looking for wildcards + foreach ($this->routes as $key => $val) + { + // Check if route format is using HTTP verbs + if (is_array($val)) + { + $val = array_change_key_case($val, CASE_LOWER); + if (isset($val[$http_verb])) + { + $val = $val[$http_verb]; + } + else + { + continue; + } + } + + // Convert wildcards to RegEx + $key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key); + + // Does the RegEx match? + if (preg_match('#^'.$key.'$#', $uri, $matches)) + { + // Are we using callbacks to process back-references? + if ( ! is_string($val) && is_callable($val)) + { + // Remove the original string from the matches array. + array_shift($matches); + + // Execute the callback using the values in matches as its parameters. + $val = call_user_func_array($val, $matches); + } + // Are we using the default routing method for back-references? + elseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE) + { + $val = preg_replace('#^'.$key.'$#', $val, $uri); + } + + $this->_set_request(explode('/', $val)); + return; + } + } + + // If we got this far it means we didn't encounter a + // matching route so we'll set the site default route + $this->_set_request(array_values($this->uri->segments)); + } + + // -------------------------------------------------------------------- + + /** + * Set class name + * + * @param string $class Class name + * @return void + */ + public function set_class($class) + { + $this->class = str_replace(array('/', '.'), '', $class); + } + + // -------------------------------------------------------------------- + + /** + * Fetch the current class + * + * @deprecated 3.0.0 Read the 'class' property instead + * @return string + */ + public function fetch_class() + { + return $this->class; + } + + // -------------------------------------------------------------------- + + /** + * Set method name + * + * @param string $method Method name + * @return void + */ + public function set_method($method) + { + $this->method = $method; + } + + // -------------------------------------------------------------------- + + /** + * Fetch the current method + * + * @deprecated 3.0.0 Read the 'method' property instead + * @return string + */ + public function fetch_method() + { + return $this->method; + } + + // -------------------------------------------------------------------- + + /** + * Set directory name + * + * @param string $dir Directory name + * @param bool $append Whether we're appending rather than setting the full value + * @return void + */ + public function set_directory($dir, $append = FALSE) + { + if ($append !== TRUE OR empty($this->directory)) + { + $this->directory = str_replace('.', '', trim($dir, '/')).'/'; + } + else + { + $this->directory .= str_replace('.', '', trim($dir, '/')).'/'; + } + } + + // -------------------------------------------------------------------- + + /** + * Fetch directory + * + * Feches the sub-directory (if any) that contains the requested + * controller class. + * + * @deprecated 3.0.0 Read the 'directory' property instead + * @return string + */ + public function fetch_directory() + { + return $this->directory; + } + +} diff --git a/system/core/Security.php b/system/core/Security.php new file mode 100644 index 0000000..31926b4 --- /dev/null +++ b/system/core/Security.php @@ -0,0 +1,1090 @@ +', '<', '>', + "'", '"', '&', '$', '#', + '{', '}', '[', ']', '=', + ';', '?', '%20', '%22', + '%3c', // < + '%253c', // < + '%3e', // > + '%0e', // > + '%28', // ( + '%29', // ) + '%2528', // ( + '%26', // & + '%24', // $ + '%3f', // ? + '%3b', // ; + '%3d' // = + ); + + /** + * Character set + * + * Will be overridden by the constructor. + * + * @var string + */ + public $charset = 'UTF-8'; + + /** + * XSS Hash + * + * Random Hash for protecting URLs. + * + * @var string + */ + protected $_xss_hash; + + /** + * CSRF Hash + * + * Random hash for Cross Site Request Forgery protection cookie + * + * @var string + */ + protected $_csrf_hash; + + /** + * CSRF Expire time + * + * Expiration time for Cross Site Request Forgery protection cookie. + * Defaults to two hours (in seconds). + * + * @var int + */ + protected $_csrf_expire = 7200; + + /** + * CSRF Token name + * + * Token name for Cross Site Request Forgery protection cookie. + * + * @var string + */ + protected $_csrf_token_name = 'ci_csrf_token'; + + /** + * CSRF Cookie name + * + * Cookie name for Cross Site Request Forgery protection cookie. + * + * @var string + */ + protected $_csrf_cookie_name = 'ci_csrf_token'; + + /** + * List of never allowed strings + * + * @var array + */ + protected $_never_allowed_str = array( + 'document.cookie' => '[removed]', + '(document).cookie' => '[removed]', + 'document.write' => '[removed]', + '(document).write' => '[removed]', + '.parentNode' => '[removed]', + '.innerHTML' => '[removed]', + '-moz-binding' => '[removed]', + '' => '-->', + ' '<![CDATA[', + '' => '<comment>', + '<%' => '<%' + ); + + /** + * List of never allowed regex replacements + * + * @var array + */ + protected $_never_allowed_regex = array( + 'javascript\s*:', + '(\(?document\)?|\(?window\)?(\.document)?)\.(location|on\w*)', + 'expression\s*(\(|&\#40;)', // CSS and IE + 'vbscript\s*:', // IE, surprise! + 'wscript\s*:', // IE + 'jscript\s*:', // IE + 'vbs\s*:', // IE + 'Redirect\s+30\d', + "([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?" + ); + + /** + * Class constructor + * + * @return void + */ + public function __construct() + { + // Is CSRF protection enabled? + if (config_item('csrf_protection')) + { + // CSRF config + foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key) + { + if (NULL !== ($val = config_item($key))) + { + $this->{'_'.$key} = $val; + } + } + + // Append application specific cookie prefix + if ($cookie_prefix = config_item('cookie_prefix')) + { + $this->_csrf_cookie_name = $cookie_prefix.$this->_csrf_cookie_name; + } + + // Set the CSRF hash + $this->_csrf_set_hash(); + } + + $this->charset = strtoupper(config_item('charset')); + + log_message('info', 'Security Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * CSRF Verify + * + * @return CI_Security + */ + public function csrf_verify() + { + // If it's not a POST request we will set the CSRF cookie + if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') + { + return $this->csrf_set_cookie(); + } + + // Check if URI has been whitelisted from CSRF checks + if ($exclude_uris = config_item('csrf_exclude_uris')) + { + $uri = load_class('URI', 'core'); + foreach ($exclude_uris as $excluded) + { + if (preg_match('#^'.$excluded.'$#i'.(UTF8_ENABLED ? 'u' : ''), $uri->uri_string())) + { + return $this; + } + } + } + + // Check CSRF token validity, but don't error on mismatch just yet - we'll want to regenerate + $valid = isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]) + && hash_equals($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]); + + // We kill this since we're done and we don't want to pollute the _POST array + unset($_POST[$this->_csrf_token_name]); + + // Regenerate on every submission? + if (config_item('csrf_regenerate')) + { + // Nothing should last forever + unset($_COOKIE[$this->_csrf_cookie_name]); + $this->_csrf_hash = NULL; + } + + $this->_csrf_set_hash(); + $this->csrf_set_cookie(); + + if ($valid !== TRUE) + { + $this->csrf_show_error(); + } + + log_message('info', 'CSRF token verified'); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * CSRF Set Cookie + * + * @codeCoverageIgnore + * @return CI_Security + */ + public function csrf_set_cookie() + { + $expire = time() + $this->_csrf_expire; + $secure_cookie = (bool) config_item('cookie_secure'); + + if ($secure_cookie && ! is_https()) + { + return FALSE; + } + + setcookie( + $this->_csrf_cookie_name, + $this->_csrf_hash, + $expire, + config_item('cookie_path'), + config_item('cookie_domain'), + $secure_cookie, + config_item('cookie_httponly') + ); + log_message('info', 'CSRF cookie sent'); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Show CSRF Error + * + * @return void + */ + public function csrf_show_error() + { + show_error('The action you have requested is not allowed.', 403); + } + + // -------------------------------------------------------------------- + + /** + * Get CSRF Hash + * + * @see CI_Security::$_csrf_hash + * @return string CSRF hash + */ + public function get_csrf_hash() + { + return $this->_csrf_hash; + } + + // -------------------------------------------------------------------- + + /** + * Get CSRF Token Name + * + * @see CI_Security::$_csrf_token_name + * @return string CSRF token name + */ + public function get_csrf_token_name() + { + return $this->_csrf_token_name; + } + + // -------------------------------------------------------------------- + + /** + * XSS Clean + * + * Sanitizes data so that Cross Site Scripting Hacks can be + * prevented. This method does a fair amount of work but + * it is extremely thorough, designed to prevent even the + * most obscure XSS attempts. Nothing is ever 100% foolproof, + * of course, but I haven't been able to get anything passed + * the filter. + * + * Note: Should only be used to deal with data upon submission. + * It's not something that should be used for general + * runtime processing. + * + * @link http://channel.bitflux.ch/wiki/XSS_Prevention + * Based in part on some code and ideas from Bitflux. + * + * @link http://ha.ckers.org/xss.html + * To help develop this script I used this great list of + * vulnerabilities along with a few other hacks I've + * harvested from examining vulnerabilities in other programs. + * + * @param string|string[] $str Input data + * @param bool $is_image Whether the input is an image + * @return string + */ + public function xss_clean($str, $is_image = FALSE) + { + // Is the string an array? + if (is_array($str)) + { + foreach ($str as $key => &$value) + { + $str[$key] = $this->xss_clean($value); + } + + return $str; + } + + // Remove Invisible Characters + $str = remove_invisible_characters($str); + + /* + * URL Decode + * + * Just in case stuff like this is submitted: + * + * Google + * + * Note: Use rawurldecode() so it does not remove plus signs + */ + if (stripos($str, '%') !== false) + { + do + { + $oldstr = $str; + $str = rawurldecode($str); + $str = preg_replace_callback('#%(?:\s*[0-9a-f]){2,}#i', array($this, '_urldecodespaces'), $str); + } + while ($oldstr !== $str); + unset($oldstr); + } + + /* + * Convert character entities to ASCII + * + * This permits our tests below to work reliably. + * We only convert entities that are within tags since + * these are the ones that will pose security problems. + */ + $str = preg_replace_callback("/[^a-z0-9>]+[a-z0-9]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str); + $str = preg_replace_callback('/<\w+.*/si', array($this, '_decode_entity'), $str); + + // Remove Invisible Characters Again! + $str = remove_invisible_characters($str); + + /* + * Convert all tabs to spaces + * + * This prevents strings like this: ja vascript + * NOTE: we deal with spaces between characters later. + * NOTE: preg_replace was found to be amazingly slow here on + * large blocks of data, so we use str_replace. + */ + $str = str_replace("\t", ' ', $str); + + // Capture converted string for later comparison + $converted_string = $str; + + // Remove Strings that are never allowed + $str = $this->_do_never_allowed($str); + + /* + * Makes PHP tags safe + * + * Note: XML tags are inadvertently replaced too: + * + * '), array('<?', '?>'), $str); + } + + /* + * Compact any exploded words + * + * This corrects words like: j a v a s c r i p t + * These words are compacted back to their correct state. + */ + $words = array( + 'javascript', 'expression', 'vbscript', 'jscript', 'wscript', + 'vbs', 'script', 'base64', 'applet', 'alert', 'document', + 'write', 'cookie', 'window', 'confirm', 'prompt', 'eval' + ); + + foreach ($words as $word) + { + $word = implode('\s*', str_split($word)).'\s*'; + + // We only want to do this when it is followed by a non-word character + // That way valid stuff like "dealer to" does not become "dealerto" + $str = preg_replace_callback('#('.substr($word, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str); + } + + /* + * Remove disallowed Javascript in links or img tags + * We used to do some version comparisons and use of stripos(), + * but it is dog slow compared to these simplified non-capturing + * preg_match(), especially if the pattern exists in the string + * + * Note: It was reported that not only space characters, but all in + * the following pattern can be parsed as separators between a tag name + * and its attributes: [\d\s"\'`;,\/\=\(\x00\x0B\x09\x0C] + * ... however, remove_invisible_characters() above already strips the + * hex-encoded ones, so we'll skip them below. + */ + do + { + $original = $str; + + if (preg_match('/]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str); + } + + if (preg_match('/]*?)(?:\s?/?>|$)#si', array($this, '_js_img_removal'), $str); + } + + if (preg_match('/script|xss/i', $str)) + { + $str = preg_replace('##si', '[removed]', $str); + } + } + while ($original !== $str); + unset($original); + + /* + * Sanitize naughty HTML elements + * + * If a tag containing any of the words in the list + * below is found, the tag gets converted to entities. + * + * So this: + * Becomes: <blink> + */ + $pattern = '#' + .'<((?/*\s*)((?[a-z0-9]+)(?=[^a-z0-9]|$)|.+)' // tag start and name, followed by a non-tag character + .'[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator + // optional attributes + .'(?(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons + .'[^\s\042\047>/=]+' // attribute characters + // optional attribute-value + .'(?:\s*=' // attribute-value separator + .'(?:[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*))' // single, double or non-quoted value + .')?' // end optional attribute-value group + .')*)' // end optional attributes group + .'[^>]*)(?\>)?#isS'; + + // Note: It would be nice to optimize this for speed, BUT + // only matching the naughty elements here results in + // false positives and in turn - vulnerabilities! + do + { + $old_str = $str; + $str = preg_replace_callback($pattern, array($this, '_sanitize_naughty_html'), $str); + } + while ($old_str !== $str); + unset($old_str); + + /* + * Sanitize naughty scripting elements + * + * Similar to above, only instead of looking for + * tags it looks for PHP and JavaScript commands + * that are disallowed. Rather than removing the + * code, it simply converts the parenthesis to entities + * rendering the code un-executable. + * + * For example: eval('some code') + * Becomes: eval('some code') + */ + $str = preg_replace( + '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', + '\\1\\2(\\3)', + $str + ); + + // Same thing, but for "tag functions" (e.g. eval`some code`) + // See https://github.com/bcit-ci/CodeIgniter/issues/5420 + $str = preg_replace( + '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)`(.*?)`#si', + '\\1\\2`\\3`', + $str + ); + + // Final clean up + // This adds a bit of extra precaution in case + // something got through the above filters + $str = $this->_do_never_allowed($str); + + /* + * Images are Handled in a Special Way + * - Essentially, we want to know that after all of the character + * conversion is done whether any unwanted, likely XSS, code was found. + * If not, we return TRUE, as the image is clean. + * However, if the string post-conversion does not matched the + * string post-removal of XSS, then it fails, as there was unwanted XSS + * code found and removed/changed during processing. + */ + if ($is_image === TRUE) + { + return ($str === $converted_string); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * XSS Hash + * + * Generates the XSS hash if needed and returns it. + * + * @see CI_Security::$_xss_hash + * @return string XSS hash + */ + public function xss_hash() + { + if ($this->_xss_hash === NULL) + { + $rand = $this->get_random_bytes(16); + $this->_xss_hash = ($rand === FALSE) + ? md5(uniqid(mt_rand(), TRUE)) + : bin2hex($rand); + } + + return $this->_xss_hash; + } + + // -------------------------------------------------------------------- + + /** + * Get random bytes + * + * @param int $length Output length + * @return string + */ + public function get_random_bytes($length) + { + if (empty($length) OR ! ctype_digit((string) $length)) + { + return FALSE; + } + + if (function_exists('random_bytes')) + { + try + { + // The cast is required to avoid TypeError + return random_bytes((int) $length); + } + catch (Exception $e) + { + // If random_bytes() can't do the job, we can't either ... + // There's no point in using fallbacks. + log_message('error', $e->getMessage()); + return FALSE; + } + } + + // Unfortunately, none of the following PRNGs is guaranteed to exist ... + if (defined('MCRYPT_DEV_URANDOM') && ($output = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM)) !== FALSE) + { + return $output; + } + + + if (is_readable('/dev/urandom') && ($fp = fopen('/dev/urandom', 'rb')) !== FALSE) + { + // Try not to waste entropy ... + is_php('5.4') && stream_set_chunk_size($fp, $length); + $output = fread($fp, $length); + fclose($fp); + if ($output !== FALSE) + { + return $output; + } + } + + if (function_exists('openssl_random_pseudo_bytes')) + { + return openssl_random_pseudo_bytes($length); + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * HTML Entities Decode + * + * A replacement for html_entity_decode() + * + * The reason we are not using html_entity_decode() by itself is because + * while it is not technically correct to leave out the semicolon + * at the end of an entity most browsers will still interpret the entity + * correctly. html_entity_decode() does not convert entities without + * semicolons, so we are left with our own little solution here. Bummer. + * + * @link http://php.net/html-entity-decode + * + * @param string $str Input + * @param string $charset Character set + * @return string + */ + public function entity_decode($str, $charset = NULL) + { + if (strpos($str, '&') === FALSE) + { + return $str; + } + + static $_entities; + + isset($charset) OR $charset = $this->charset; + $flag = is_php('5.4') + ? ENT_COMPAT | ENT_HTML5 + : ENT_COMPAT; + + if ( ! isset($_entities)) + { + $_entities = array_map('strtolower', get_html_translation_table(HTML_ENTITIES, $flag, $charset)); + + // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 + // entities to the array manually + if ($flag === ENT_COMPAT) + { + $_entities[':'] = ':'; + $_entities['('] = '('; + $_entities[')'] = ')'; + $_entities["\n"] = ' '; + $_entities["\t"] = ' '; + } + } + + do + { + $str_compare = $str; + + // Decode standard entities, avoiding false positives + if (preg_match_all('/&[a-z]{2,}(?![a-z;])/i', $str, $matches)) + { + $replace = array(); + $matches = array_unique(array_map('strtolower', $matches[0])); + foreach ($matches as &$match) + { + if (($char = array_search($match.';', $_entities, TRUE)) !== FALSE) + { + $replace[$match] = $char; + } + } + + $str = str_replace(array_keys($replace), array_values($replace), $str); + } + + // Decode numeric & UTF16 two byte entities + $str = html_entity_decode( + preg_replace('/(&#(?:x0*[0-9a-f]{2,5}(?![0-9a-f;])|(?:0*\d{2,4}(?![0-9;]))))/iS', '$1;', $str), + $flag, + $charset + ); + + if ($flag === ENT_COMPAT) + { + $str = str_replace(array_values($_entities), array_keys($_entities), $str); + } + } + while ($str_compare !== $str); + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Sanitize Filename + * + * @param string $str Input file name + * @param bool $relative_path Whether to preserve paths + * @return string + */ + public function sanitize_filename($str, $relative_path = FALSE) + { + $bad = $this->filename_bad_chars; + + if ( ! $relative_path) + { + $bad[] = './'; + $bad[] = '/'; + } + + $str = remove_invisible_characters($str, FALSE); + + do + { + $old = $str; + $str = str_replace($bad, '', $str); + } + while ($old !== $str); + + return stripslashes($str); + } + + // ---------------------------------------------------------------- + + /** + * Strip Image Tags + * + * @param string $str + * @return string + */ + public function strip_image_tags($str) + { + return preg_replace( + array( + '##i', + '#`]+)).*?\>#i' + ), + '\\2', + $str + ); + } + + // ---------------------------------------------------------------- + + /** + * URL-decode taking spaces into account + * + * @see https://github.com/bcit-ci/CodeIgniter/issues/4877 + * @param array $matches + * @return string + */ + protected function _urldecodespaces($matches) + { + $input = $matches[0]; + $nospaces = preg_replace('#\s+#', '', $input); + return ($nospaces === $input) + ? $input + : rawurldecode($nospaces); + } + + // ---------------------------------------------------------------- + + /** + * Compact Exploded Words + * + * Callback method for xss_clean() to remove whitespace from + * things like 'j a v a s c r i p t'. + * + * @used-by CI_Security::xss_clean() + * @param array $matches + * @return string + */ + protected function _compact_exploded_words($matches) + { + return preg_replace('/\s+/s', '', $matches[1]).$matches[2]; + } + + // -------------------------------------------------------------------- + + /** + * Sanitize Naughty HTML + * + * Callback method for xss_clean() to remove naughty HTML elements. + * + * @used-by CI_Security::xss_clean() + * @param array $matches + * @return string + */ + protected function _sanitize_naughty_html($matches) + { + static $naughty_tags = array( + 'alert', 'area', 'prompt', 'confirm', 'applet', 'audio', 'basefont', 'base', 'behavior', 'bgsound', + 'blink', 'body', 'embed', 'expression', 'form', 'frameset', 'frame', 'head', 'html', 'ilayer', + 'iframe', 'input', 'button', 'select', 'isindex', 'layer', 'link', 'meta', 'keygen', 'object', + 'plaintext', 'style', 'script', 'textarea', 'title', 'math', 'video', 'svg', 'xml', 'xss' + ); + + static $evil_attributes = array( + 'on\w+', 'style', 'xmlns', 'formaction', 'form', 'xlink:href', 'FSCommand', 'seekSegmentTime' + ); + + // First, escape unclosed tags + if (empty($matches['closeTag'])) + { + return '<'.$matches[1]; + } + // Is the element that we caught naughty? If so, escape it + elseif (in_array(strtolower($matches['tagName']), $naughty_tags, TRUE)) + { + return '<'.$matches[1].'>'; + } + // For other tags, see if their attributes are "evil" and strip those + elseif (isset($matches['attributes'])) + { + // We'll store the already filtered attributes here + $attributes = array(); + + // Attribute-catching pattern + $attributes_pattern = '#' + .'(?[^\s\042\047>/=]+)' // attribute characters + // optional attribute-value + .'(?:\s*=(?[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator + .'#i'; + + // Blacklist pattern for evil attribute names + $is_evil_pattern = '#^('.implode('|', $evil_attributes).')$#i'; + + // Each iteration filters a single attribute + do + { + // Strip any non-alpha characters that may precede an attribute. + // Browsers often parse these incorrectly and that has been a + // of numerous XSS issues we've had. + $matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']); + + if ( ! preg_match($attributes_pattern, $matches['attributes'], $attribute, PREG_OFFSET_CAPTURE)) + { + // No (valid) attribute found? Discard everything else inside the tag + break; + } + + if ( + // Is it indeed an "evil" attribute? + preg_match($is_evil_pattern, $attribute['name'][0]) + // Or does it have an equals sign, but no value and not quoted? Strip that too! + OR (trim($attribute['value'][0]) === '') + ) + { + $attributes[] = 'xss=removed'; + } + else + { + $attributes[] = $attribute[0][0]; + } + + $matches['attributes'] = substr($matches['attributes'], $attribute[0][1] + strlen($attribute[0][0])); + } + while ($matches['attributes'] !== ''); + + $attributes = empty($attributes) + ? '' + : ' '.implode(' ', $attributes); + return '<'.$matches['slash'].$matches['tagName'].$attributes.'>'; + } + + return $matches[0]; + } + + // -------------------------------------------------------------------- + + /** + * JS Link Removal + * + * Callback method for xss_clean() to sanitize links. + * + * This limits the PCRE backtracks, making it more performance friendly + * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in + * PHP 5.2+ on link-heavy strings. + * + * @used-by CI_Security::xss_clean() + * @param array $match + * @return string + */ + protected function _js_link_removal($match) + { + return str_replace( + $match[1], + preg_replace( + '#href=.*?(?:(?:alert|prompt|confirm)(?:\(|&\#40;|`|&\#96;)|javascript:|livescript:|mocha:|charset=|window\.|\(?document\)?\.|\.cookie|_filter_attributes($match[1]) + ), + $match[0] + ); + } + + // -------------------------------------------------------------------- + + /** + * JS Image Removal + * + * Callback method for xss_clean() to sanitize image tags. + * + * This limits the PCRE backtracks, making it more performance friendly + * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in + * PHP 5.2+ on image tag heavy strings. + * + * @used-by CI_Security::xss_clean() + * @param array $match + * @return string + */ + protected function _js_img_removal($match) + { + return str_replace( + $match[1], + preg_replace( + '#src=.*?(?:(?:alert|prompt|confirm|eval)(?:\(|&\#40;|`|&\#96;)|javascript:|livescript:|mocha:|charset=|window\.|\(?document\)?\.|\.cookie|_filter_attributes($match[1]) + ), + $match[0] + ); + } + + // -------------------------------------------------------------------- + + /** + * Attribute Conversion + * + * @used-by CI_Security::xss_clean() + * @param array $match + * @return string + */ + protected function _convert_attribute($match) + { + return str_replace(array('>', '<', '\\'), array('>', '<', '\\\\'), $match[0]); + } + + // -------------------------------------------------------------------- + + /** + * Filter Attributes + * + * Filters tag attributes for consistency and safety. + * + * @used-by CI_Security::_js_img_removal() + * @used-by CI_Security::_js_link_removal() + * @param string $str + * @return string + */ + protected function _filter_attributes($str) + { + $out = ''; + if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches)) + { + foreach ($matches[0] as $match) + { + $out .= preg_replace('#/\*.*?\*/#s', '', $match); + } + } + + return $out; + } + + // -------------------------------------------------------------------- + + /** + * HTML Entity Decode Callback + * + * @used-by CI_Security::xss_clean() + * @param array $match + * @return string + */ + protected function _decode_entity($match) + { + // Protect GET variables in URLs + // 901119URL5918AMP18930PROTECT8198 + $match = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-/]+)|i', $this->xss_hash().'\\1=\\2', $match[0]); + + // Decode, then un-protect URL GET vars + return str_replace( + $this->xss_hash(), + '&', + $this->entity_decode($match, $this->charset) + ); + } + + // -------------------------------------------------------------------- + + /** + * Do Never Allowed + * + * @used-by CI_Security::xss_clean() + * @param string + * @return string + */ + protected function _do_never_allowed($str) + { + $str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str); + + foreach ($this->_never_allowed_regex as $regex) + { + $str = preg_replace('#'.$regex.'#is', '[removed]', $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Set CSRF Hash and Cookie + * + * @return string + */ + protected function _csrf_set_hash() + { + if ($this->_csrf_hash === NULL) + { + // If the cookie exists we will use its value. + // We don't necessarily want to regenerate it with + // each page load since a page could contain embedded + // sub-pages causing this feature to fail + if (isset($_COOKIE[$this->_csrf_cookie_name]) && is_string($_COOKIE[$this->_csrf_cookie_name]) + && preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1) + { + return $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name]; + } + + $rand = $this->get_random_bytes(16); + $this->_csrf_hash = ($rand === FALSE) + ? md5(uniqid(mt_rand(), TRUE)) + : bin2hex($rand); + } + + return $this->_csrf_hash; + } + +} diff --git a/system/core/URI.php b/system/core/URI.php new file mode 100644 index 0000000..574ade6 --- /dev/null +++ b/system/core/URI.php @@ -0,0 +1,643 @@ +config =& load_class('Config', 'core'); + + // If query strings are enabled, we don't need to parse any segments. + // However, they don't make sense under CLI. + if (is_cli() OR $this->config->item('enable_query_strings') !== TRUE) + { + $this->_permitted_uri_chars = $this->config->item('permitted_uri_chars'); + + // If it's a CLI request, ignore the configuration + if (is_cli()) + { + $uri = $this->_parse_argv(); + } + else + { + $protocol = $this->config->item('uri_protocol'); + empty($protocol) && $protocol = 'REQUEST_URI'; + + switch ($protocol) + { + case 'AUTO': // For BC purposes only + case 'REQUEST_URI': + $uri = $this->_parse_request_uri(); + break; + case 'QUERY_STRING': + $uri = $this->_parse_query_string(); + break; + case 'PATH_INFO': + default: + $uri = isset($_SERVER[$protocol]) + ? $_SERVER[$protocol] + : $this->_parse_request_uri(); + break; + } + } + + $this->_set_uri_string($uri); + } + + log_message('info', 'URI Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Set URI String + * + * @param string $str + * @return void + */ + protected function _set_uri_string($str) + { + // Filter out control characters and trim slashes + $this->uri_string = trim(remove_invisible_characters($str, FALSE), '/'); + + if ($this->uri_string !== '') + { + // Remove the URL suffix, if present + if (($suffix = (string) $this->config->item('url_suffix')) !== '') + { + $slen = strlen($suffix); + + if (substr($this->uri_string, -$slen) === $suffix) + { + $this->uri_string = substr($this->uri_string, 0, -$slen); + } + } + + $this->segments[0] = NULL; + // Populate the segments array + foreach (explode('/', trim($this->uri_string, '/')) as $val) + { + $val = trim($val); + // Filter segments for security + $this->filter_uri($val); + + if ($val !== '') + { + $this->segments[] = $val; + } + } + + unset($this->segments[0]); + } + } + + // -------------------------------------------------------------------- + + /** + * Parse REQUEST_URI + * + * Will parse REQUEST_URI and automatically detect the URI from it, + * while fixing the query string if necessary. + * + * @return string + */ + protected function _parse_request_uri() + { + if ( ! isset($_SERVER['REQUEST_URI'], $_SERVER['SCRIPT_NAME'])) + { + return ''; + } + + // parse_url() returns false if no host is present, but the path or query string + // contains a colon followed by a number + $uri = parse_url('http://dummy'.$_SERVER['REQUEST_URI']); + $query = isset($uri['query']) ? $uri['query'] : ''; + $uri = isset($uri['path']) ? $uri['path'] : ''; + + if (isset($_SERVER['SCRIPT_NAME'][0])) + { + if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) + { + $uri = (string) substr($uri, strlen($_SERVER['SCRIPT_NAME'])); + } + elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) + { + $uri = (string) substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); + } + } + + // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct + // URI is found, and also fixes the QUERY_STRING server var and $_GET array. + if (trim($uri, '/') === '' && strncmp($query, '/', 1) === 0) + { + $query = explode('?', $query, 2); + $uri = $query[0]; + $_SERVER['QUERY_STRING'] = isset($query[1]) ? $query[1] : ''; + } + else + { + $_SERVER['QUERY_STRING'] = $query; + } + + parse_str($_SERVER['QUERY_STRING'], $_GET); + + if ($uri === '/' OR $uri === '') + { + return '/'; + } + + // Do some final cleaning of the URI and return it + return $this->_remove_relative_directory($uri); + } + + // -------------------------------------------------------------------- + + /** + * Parse QUERY_STRING + * + * Will parse QUERY_STRING and automatically detect the URI from it. + * + * @return string + */ + protected function _parse_query_string() + { + $uri = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); + + if (trim($uri, '/') === '') + { + return ''; + } + elseif (strncmp($uri, '/', 1) === 0) + { + $uri = explode('?', $uri, 2); + $_SERVER['QUERY_STRING'] = isset($uri[1]) ? $uri[1] : ''; + $uri = $uri[0]; + } + + parse_str($_SERVER['QUERY_STRING'], $_GET); + + return $this->_remove_relative_directory($uri); + } + + // -------------------------------------------------------------------- + + /** + * Parse CLI arguments + * + * Take each command line argument and assume it is a URI segment. + * + * @return string + */ + protected function _parse_argv() + { + $args = array_slice($_SERVER['argv'], 1); + return $args ? implode('/', $args) : ''; + } + + // -------------------------------------------------------------------- + + /** + * Remove relative directory (../) and multi slashes (///) + * + * Do some final cleaning of the URI and return it, currently only used in self::_parse_request_uri() + * + * @param string $uri + * @return string + */ + protected function _remove_relative_directory($uri) + { + $uris = array(); + $tok = strtok($uri, '/'); + while ($tok !== FALSE) + { + if (( ! empty($tok) OR $tok === '0') && $tok !== '..') + { + $uris[] = $tok; + } + $tok = strtok('/'); + } + + return implode('/', $uris); + } + + // -------------------------------------------------------------------- + + /** + * Filter URI + * + * Filters segments for malicious characters. + * + * @param string $str + * @return void + */ + public function filter_uri(&$str) + { + if ( ! empty($str) && ! empty($this->_permitted_uri_chars) && ! preg_match('/^['.$this->_permitted_uri_chars.']+$/i'.(UTF8_ENABLED ? 'u' : ''), $str)) + { + show_error('The URI you submitted has disallowed characters.', 400); + } + } + + // -------------------------------------------------------------------- + + /** + * Fetch URI Segment + * + * @see CI_URI::$segments + * @param int $n Index + * @param mixed $no_result What to return if the segment index is not found + * @return mixed + */ + public function segment($n, $no_result = NULL) + { + return isset($this->segments[$n]) ? $this->segments[$n] : $no_result; + } + + // -------------------------------------------------------------------- + + /** + * Fetch URI "routed" Segment + * + * Returns the re-routed URI segment (assuming routing rules are used) + * based on the index provided. If there is no routing, will return + * the same result as CI_URI::segment(). + * + * @see CI_URI::$rsegments + * @see CI_URI::segment() + * @param int $n Index + * @param mixed $no_result What to return if the segment index is not found + * @return mixed + */ + public function rsegment($n, $no_result = NULL) + { + return isset($this->rsegments[$n]) ? $this->rsegments[$n] : $no_result; + } + + // -------------------------------------------------------------------- + + /** + * URI to assoc + * + * Generates an associative array of URI data starting at the supplied + * segment index. For example, if this is your URI: + * + * example.com/user/search/name/joe/location/UK/gender/male + * + * You can use this method to generate an array with this prototype: + * + * array ( + * name => joe + * location => UK + * gender => male + * ) + * + * @param int $n Index (default: 3) + * @param array $default Default values + * @return array + */ + public function uri_to_assoc($n = 3, $default = array()) + { + return $this->_uri_to_assoc($n, $default, 'segment'); + } + + // -------------------------------------------------------------------- + + /** + * Routed URI to assoc + * + * Identical to CI_URI::uri_to_assoc(), only it uses the re-routed + * segment array. + * + * @see CI_URI::uri_to_assoc() + * @param int $n Index (default: 3) + * @param array $default Default values + * @return array + */ + public function ruri_to_assoc($n = 3, $default = array()) + { + return $this->_uri_to_assoc($n, $default, 'rsegment'); + } + + // -------------------------------------------------------------------- + + /** + * Internal URI-to-assoc + * + * Generates a key/value pair from the URI string or re-routed URI string. + * + * @used-by CI_URI::uri_to_assoc() + * @used-by CI_URI::ruri_to_assoc() + * @param int $n Index (default: 3) + * @param array $default Default values + * @param string $which Array name ('segment' or 'rsegment') + * @return array + */ + protected function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') + { + if ( ! is_numeric($n)) + { + return $default; + } + + if (isset($this->keyval[$which], $this->keyval[$which][$n])) + { + return $this->keyval[$which][$n]; + } + + $total_segments = "total_{$which}s"; + $segment_array = "{$which}_array"; + + if ($this->$total_segments() < $n) + { + return (count($default) === 0) + ? array() + : array_fill_keys($default, NULL); + } + + $segments = array_slice($this->$segment_array(), ($n - 1)); + $i = 0; + $lastval = ''; + $retval = array(); + foreach ($segments as $seg) + { + if ($i % 2) + { + $retval[$lastval] = $seg; + } + else + { + $retval[$seg] = NULL; + $lastval = $seg; + } + + $i++; + } + + if (count($default) > 0) + { + foreach ($default as $val) + { + if ( ! array_key_exists($val, $retval)) + { + $retval[$val] = NULL; + } + } + } + + // Cache the array for reuse + isset($this->keyval[$which]) OR $this->keyval[$which] = array(); + $this->keyval[$which][$n] = $retval; + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Assoc to URI + * + * Generates a URI string from an associative array. + * + * @param array $array Input array of key/value pairs + * @return string URI string + */ + public function assoc_to_uri($array) + { + $temp = array(); + foreach ((array) $array as $key => $val) + { + $temp[] = $key; + $temp[] = $val; + } + + return implode('/', $temp); + } + + // -------------------------------------------------------------------- + + /** + * Slash segment + * + * Fetches an URI segment with a slash. + * + * @param int $n Index + * @param string $where Where to add the slash ('trailing' or 'leading') + * @return string + */ + public function slash_segment($n, $where = 'trailing') + { + return $this->_slash_segment($n, $where, 'segment'); + } + + // -------------------------------------------------------------------- + + /** + * Slash routed segment + * + * Fetches an URI routed segment with a slash. + * + * @param int $n Index + * @param string $where Where to add the slash ('trailing' or 'leading') + * @return string + */ + public function slash_rsegment($n, $where = 'trailing') + { + return $this->_slash_segment($n, $where, 'rsegment'); + } + + // -------------------------------------------------------------------- + + /** + * Internal Slash segment + * + * Fetches an URI Segment and adds a slash to it. + * + * @used-by CI_URI::slash_segment() + * @used-by CI_URI::slash_rsegment() + * + * @param int $n Index + * @param string $where Where to add the slash ('trailing' or 'leading') + * @param string $which Array name ('segment' or 'rsegment') + * @return string + */ + protected function _slash_segment($n, $where = 'trailing', $which = 'segment') + { + $leading = $trailing = '/'; + + if ($where === 'trailing') + { + $leading = ''; + } + elseif ($where === 'leading') + { + $trailing = ''; + } + + return $leading.$this->$which($n).$trailing; + } + + // -------------------------------------------------------------------- + + /** + * Segment Array + * + * @return array CI_URI::$segments + */ + public function segment_array() + { + return $this->segments; + } + + // -------------------------------------------------------------------- + + /** + * Routed Segment Array + * + * @return array CI_URI::$rsegments + */ + public function rsegment_array() + { + return $this->rsegments; + } + + // -------------------------------------------------------------------- + + /** + * Total number of segments + * + * @return int + */ + public function total_segments() + { + return count($this->segments); + } + + // -------------------------------------------------------------------- + + /** + * Total number of routed segments + * + * @return int + */ + public function total_rsegments() + { + return count($this->rsegments); + } + + // -------------------------------------------------------------------- + + /** + * Fetch URI string + * + * @return string CI_URI::$uri_string + */ + public function uri_string() + { + return $this->uri_string; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Re-routed URI string + * + * @return string + */ + public function ruri_string() + { + return ltrim(load_class('Router', 'core')->directory, '/').implode('/', $this->rsegments); + } + +} diff --git a/system/core/Utf8.php b/system/core/Utf8.php new file mode 100644 index 0000000..7e02177 --- /dev/null +++ b/system/core/Utf8.php @@ -0,0 +1,164 @@ +is_ascii($str) === FALSE) + { + if (MB_ENABLED) + { + $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); + } + elseif (ICONV_ENABLED) + { + $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); + } + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Remove ASCII control characters + * + * Removes all ASCII control characters except horizontal tabs, + * line feeds, and carriage returns, as all others can cause + * problems in XML. + * + * @param string $str String to clean + * @return string + */ + public function safe_ascii_for_xml($str) + { + return remove_invisible_characters($str, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Convert to UTF-8 + * + * Attempts to convert a string to UTF-8. + * + * @param string $str Input string + * @param string $encoding Input encoding + * @return string $str encoded in UTF-8 or FALSE on failure + */ + public function convert_to_utf8($str, $encoding) + { + if (MB_ENABLED) + { + return mb_convert_encoding($str, 'UTF-8', $encoding); + } + elseif (ICONV_ENABLED) + { + return @iconv($encoding, 'UTF-8', $str); + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Is ASCII? + * + * Tests if a string is standard 7-bit ASCII or not. + * + * @param string $str String to check + * @return bool + */ + public function is_ascii($str) + { + return (preg_match('/[^\x00-\x7F]/S', $str) === 0); + } + +} diff --git a/system/core/compat/hash.php b/system/core/compat/hash.php new file mode 100644 index 0000000..68a8129 --- /dev/null +++ b/system/core/compat/hash.php @@ -0,0 +1,254 @@ + 32, + 'haval128,3' => 128, + 'haval160,3' => 128, + 'haval192,3' => 128, + 'haval224,3' => 128, + 'haval256,3' => 128, + 'haval128,4' => 128, + 'haval160,4' => 128, + 'haval192,4' => 128, + 'haval224,4' => 128, + 'haval256,4' => 128, + 'haval128,5' => 128, + 'haval160,5' => 128, + 'haval192,5' => 128, + 'haval224,5' => 128, + 'haval256,5' => 128, + 'md2' => 16, + 'md4' => 64, + 'md5' => 64, + 'ripemd128' => 64, + 'ripemd160' => 64, + 'ripemd256' => 64, + 'ripemd320' => 64, + 'salsa10' => 64, + 'salsa20' => 64, + 'sha1' => 64, + 'sha224' => 64, + 'sha256' => 64, + 'sha384' => 128, + 'sha512' => 128, + 'snefru' => 32, + 'snefru256' => 32, + 'tiger128,3' => 64, + 'tiger160,3' => 64, + 'tiger192,3' => 64, + 'tiger128,4' => 64, + 'tiger160,4' => 64, + 'tiger192,4' => 64, + 'whirlpool' => 64 + ); + + if (isset($block_sizes[$algo], $password[$block_sizes[$algo]])) + { + $password = hash($algo, $password, TRUE); + } + + $hash = ''; + // Note: Blocks are NOT 0-indexed + for ($bc = (int) ceil($length / $hash_length), $bi = 1; $bi <= $bc; $bi++) + { + $key = $derived_key = hash_hmac($algo, $salt.pack('N', $bi), $password, TRUE); + for ($i = 1; $i < $iterations; $i++) + { + $derived_key ^= $key = hash_hmac($algo, $key, $password, TRUE); + } + + $hash .= $derived_key; + } + + // This is not RFC-compatible, but we're aiming for natural PHP compatibility + if ( ! $raw_output) + { + $hash = bin2hex($hash); + } + + return defined('MB_OVERLOAD_STRING') + ? mb_substr($hash, 0, $length, '8bit') + : substr($hash, 0, $length); + } +} diff --git a/system/core/compat/index.html b/system/core/compat/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/core/compat/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/core/compat/mbstring.php b/system/core/compat/mbstring.php new file mode 100644 index 0000000..9f6c24e --- /dev/null +++ b/system/core/compat/mbstring.php @@ -0,0 +1,149 @@ + 0, 'algoName' => 'unknown', 'options' => array()) + : array('algo' => 1, 'algoName' => 'bcrypt', 'options' => array('cost' => $hash)); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('password_hash')) +{ + /** + * password_hash() + * + * @link http://php.net/password_hash + * @param string $password + * @param int $algo + * @param array $options + * @return mixed + */ + function password_hash($password, $algo, array $options = array()) + { + static $func_overload; + isset($func_overload) OR $func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); + + if ($algo !== 1) + { + trigger_error('password_hash(): Unknown hashing algorithm: '.(int) $algo, E_USER_WARNING); + return NULL; + } + + if (isset($options['cost']) && ($options['cost'] < 4 OR $options['cost'] > 31)) + { + trigger_error('password_hash(): Invalid bcrypt cost parameter specified: '.(int) $options['cost'], E_USER_WARNING); + return NULL; + } + + if (isset($options['salt']) && ($saltlen = ($func_overload ? mb_strlen($options['salt'], '8bit') : strlen($options['salt']))) < 22) + { + trigger_error('password_hash(): Provided salt is too short: '.$saltlen.' expecting 22', E_USER_WARNING); + return NULL; + } + elseif ( ! isset($options['salt'])) + { + if (function_exists('random_bytes')) + { + try + { + $options['salt'] = random_bytes(16); + } + catch (Exception $e) + { + log_message('error', 'compat/password: Error while trying to use random_bytes(): '.$e->getMessage()); + return FALSE; + } + } + elseif (defined('MCRYPT_DEV_URANDOM')) + { + $options['salt'] = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); + } + elseif (DIRECTORY_SEPARATOR === '/' && (is_readable($dev = '/dev/arandom') OR is_readable($dev = '/dev/urandom'))) + { + if (($fp = fopen($dev, 'rb')) === FALSE) + { + log_message('error', 'compat/password: Unable to open '.$dev.' for reading.'); + return FALSE; + } + + // Try not to waste entropy ... + is_php('5.4') && stream_set_chunk_size($fp, 16); + + $options['salt'] = ''; + for ($read = 0; $read < 16; $read = ($func_overload) ? mb_strlen($options['salt'], '8bit') : strlen($options['salt'])) + { + if (($read = fread($fp, 16 - $read)) === FALSE) + { + log_message('error', 'compat/password: Error while reading from '.$dev.'.'); + return FALSE; + } + $options['salt'] .= $read; + } + + fclose($fp); + } + elseif (function_exists('openssl_random_pseudo_bytes')) + { + $is_secure = NULL; + $options['salt'] = openssl_random_pseudo_bytes(16, $is_secure); + if ($is_secure !== TRUE) + { + log_message('error', 'compat/password: openssl_random_pseudo_bytes() set the $cryto_strong flag to FALSE'); + return FALSE; + } + } + else + { + log_message('error', 'compat/password: No CSPRNG available.'); + return FALSE; + } + + $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); + } + elseif ( ! preg_match('#^[a-zA-Z0-9./]+$#D', $options['salt'])) + { + $options['salt'] = str_replace('+', '.', rtrim(base64_encode($options['salt']), '=')); + } + + isset($options['cost']) OR $options['cost'] = 10; + + return (strlen($password = crypt($password, sprintf('$2y$%02d$%s', $options['cost'], $options['salt']))) === 60) + ? $password + : FALSE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('password_needs_rehash')) +{ + /** + * password_needs_rehash() + * + * @link http://php.net/password_needs_rehash + * @param string $hash + * @param int $algo + * @param array $options + * @return bool + */ + function password_needs_rehash($hash, $algo, array $options = array()) + { + $info = password_get_info($hash); + + if ($algo !== $info['algo']) + { + return TRUE; + } + elseif ($algo === 1) + { + $options['cost'] = isset($options['cost']) ? (int) $options['cost'] : 10; + return ($info['options']['cost'] !== $options['cost']); + } + + // Odd at first glance, but according to a comment in PHP's own unit tests, + // because it is an unknown algorithm - it's valid and therefore doesn't + // need rehashing. + return FALSE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('password_verify')) +{ + /** + * password_verify() + * + * @link http://php.net/password_verify + * @param string $password + * @param string $hash + * @return bool + */ + function password_verify($password, $hash) + { + if (strlen($hash) !== 60 OR strlen($password = crypt($password, $hash)) !== 60) + { + return FALSE; + } + + $compare = 0; + for ($i = 0; $i < 60; $i++) + { + $compare |= (ord($password[$i]) ^ ord($hash[$i])); + } + + return ($compare === 0); + } +} diff --git a/system/core/compat/standard.php b/system/core/compat/standard.php new file mode 100644 index 0000000..24f3abc --- /dev/null +++ b/system/core/compat/standard.php @@ -0,0 +1,182 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/DB.php b/system/database/DB.php new file mode 100644 index 0000000..f58c2e8 --- /dev/null +++ b/system/database/DB.php @@ -0,0 +1,218 @@ +load->get_package_paths() as $path) + { + if ($path !== APPPATH) + { + if (file_exists($file_path = $path.'config/'.ENVIRONMENT.'/database.php')) + { + include($file_path); + } + elseif (file_exists($file_path = $path.'config/database.php')) + { + include($file_path); + } + } + } + } + + if ( ! isset($db) OR count($db) === 0) + { + show_error('No database connection settings were found in the database config file.'); + } + + if ($params !== '') + { + $active_group = $params; + } + + if ( ! isset($active_group)) + { + show_error('You have not specified a database connection group via $active_group in your config/database.php file.'); + } + elseif ( ! isset($db[$active_group])) + { + show_error('You have specified an invalid database connection group ('.$active_group.') in your config/database.php file.'); + } + + $params = $db[$active_group]; + } + elseif (is_string($params)) + { + /** + * Parse the URL from the DSN string + * Database settings can be passed as discreet + * parameters or as a data source name in the first + * parameter. DSNs must have this prototype: + * $dsn = 'driver://username:password@hostname/database'; + */ + if (($dsn = @parse_url($params)) === FALSE) + { + show_error('Invalid DB Connection String'); + } + + $params = array( + 'dbdriver' => $dsn['scheme'], + 'hostname' => isset($dsn['host']) ? rawurldecode($dsn['host']) : '', + 'port' => isset($dsn['port']) ? rawurldecode($dsn['port']) : '', + 'username' => isset($dsn['user']) ? rawurldecode($dsn['user']) : '', + 'password' => isset($dsn['pass']) ? rawurldecode($dsn['pass']) : '', + 'database' => isset($dsn['path']) ? rawurldecode(substr($dsn['path'], 1)) : '' + ); + + // Were additional config items set? + if (isset($dsn['query'])) + { + parse_str($dsn['query'], $extra); + + foreach ($extra as $key => $val) + { + if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL'))) + { + $val = var_export($val, TRUE); + } + + $params[$key] = $val; + } + } + } + + // No DB specified yet? Beat them senseless... + if (empty($params['dbdriver'])) + { + show_error('You have not selected a database type to connect to.'); + } + + // Load the DB classes. Note: Since the query builder class is optional + // we need to dynamically create a class that extends proper parent class + // based on whether we're using the query builder class or not. + if ($query_builder_override !== NULL) + { + $query_builder = $query_builder_override; + } + // Backwards compatibility work-around for keeping the + // $active_record config variable working. Should be + // removed in v3.1 + elseif ( ! isset($query_builder) && isset($active_record)) + { + $query_builder = $active_record; + } + + require_once(BASEPATH.'database/DB_driver.php'); + + if ( ! isset($query_builder) OR $query_builder === TRUE) + { + require_once(BASEPATH.'database/DB_query_builder.php'); + if ( ! class_exists('CI_DB', FALSE)) + { + /** + * CI_DB + * + * Acts as an alias for both CI_DB_driver and CI_DB_query_builder. + * + * @see CI_DB_query_builder + * @see CI_DB_driver + */ + class CI_DB extends CI_DB_query_builder { } + } + } + elseif ( ! class_exists('CI_DB', FALSE)) + { + /** + * @ignore + */ + class CI_DB extends CI_DB_driver { } + } + + // Load the DB driver + $driver_file = BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'; + + file_exists($driver_file) OR show_error('Invalid DB driver'); + require_once($driver_file); + + // Instantiate the DB adapter + $driver = 'CI_DB_'.$params['dbdriver'].'_driver'; + $DB = new $driver($params); + + // Check for a subdriver + if ( ! empty($DB->subdriver)) + { + $driver_file = BASEPATH.'database/drivers/'.$DB->dbdriver.'/subdrivers/'.$DB->dbdriver.'_'.$DB->subdriver.'_driver.php'; + + if (file_exists($driver_file)) + { + require_once($driver_file); + $driver = 'CI_DB_'.$DB->dbdriver.'_'.$DB->subdriver.'_driver'; + $DB = new $driver($params); + } + } + + $DB->initialize(); + return $DB; +} diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php new file mode 100644 index 0000000..56b7356 --- /dev/null +++ b/system/database/DB_cache.php @@ -0,0 +1,221 @@ +CI and load the file helper since we use it a lot + $this->CI =& get_instance(); + $this->db =& $db; + $this->CI->load->helper('file'); + + $this->check_path(); + } + + // -------------------------------------------------------------------- + + /** + * Set Cache Directory Path + * + * @param string $path Path to the cache directory + * @return bool + */ + public function check_path($path = '') + { + if ($path === '') + { + if ($this->db->cachedir === '') + { + return $this->db->cache_off(); + } + + $path = $this->db->cachedir; + } + + // Add a trailing slash to the path if needed + $path = realpath($path) + ? rtrim(realpath($path), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR + : rtrim($path, '/').'/'; + + if ( ! is_dir($path)) + { + log_message('debug', 'DB cache path error: '.$path); + + // If the path is wrong we'll turn off caching + return $this->db->cache_off(); + } + + if ( ! is_really_writable($path)) + { + log_message('debug', 'DB cache dir not writable: '.$path); + + // If the path is not really writable we'll turn off caching + return $this->db->cache_off(); + } + + $this->db->cachedir = $path; + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Retrieve a cached query + * + * The URI being requested will become the name of the cache sub-folder. + * An MD5 hash of the SQL statement will become the cache file name. + * + * @param string $sql + * @return string + */ + public function read($sql) + { + $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql); + + if ( ! is_file($filepath) OR FALSE === ($cachedata = file_get_contents($filepath))) + { + return FALSE; + } + + return unserialize($cachedata); + } + + // -------------------------------------------------------------------- + + /** + * Write a query to a cache file + * + * @param string $sql + * @param object $object + * @return bool + */ + public function write($sql, $object) + { + $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; + $filename = md5($sql); + + if ( ! is_dir($dir_path) && ! @mkdir($dir_path, 0750)) + { + return FALSE; + } + + if (write_file($dir_path.$filename, serialize($object)) === FALSE) + { + return FALSE; + } + + chmod($dir_path.$filename, 0640); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Delete cache files within a particular directory + * + * @param string $segment_one + * @param string $segment_two + * @return void + */ + public function delete($segment_one = '', $segment_two = '') + { + if ($segment_one === '') + { + $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + } + + if ($segment_two === '') + { + $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + } + + $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; + delete_files($dir_path, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Delete all existing cache files + * + * @return void + */ + public function delete_all() + { + delete_files($this->db->cachedir, TRUE, TRUE); + } + +} diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php new file mode 100644 index 0000000..f8956f0 --- /dev/null +++ b/system/database/DB_driver.php @@ -0,0 +1,1991 @@ + $val) + { + $this->$key = $val; + } + } + + log_message('info', 'Database Driver Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Initialize Database Settings + * + * @return bool + */ + public function initialize() + { + /* If an established connection is available, then there's + * no need to connect and select the database. + * + * Depending on the database driver, conn_id can be either + * boolean TRUE, a resource or an object. + */ + if ($this->conn_id) + { + return TRUE; + } + + // ---------------------------------------------------------------- + + // Connect to the database and set the connection ID + $this->conn_id = $this->db_connect($this->pconnect); + + // No connection resource? Check if there is a failover else throw an error + if ( ! $this->conn_id) + { + // Check if there is a failover set + if ( ! empty($this->failover) && is_array($this->failover)) + { + // Go over all the failovers + foreach ($this->failover as $failover) + { + // Replace the current settings with those of the failover + foreach ($failover as $key => $val) + { + $this->$key = $val; + } + + // Try to connect + $this->conn_id = $this->db_connect($this->pconnect); + + // If a connection is made break the foreach loop + if ($this->conn_id) + { + break; + } + } + } + + // We still don't have a connection? + if ( ! $this->conn_id) + { + log_message('error', 'Unable to connect to the database'); + + if ($this->db_debug) + { + $this->display_error('db_unable_to_connect'); + } + + return FALSE; + } + } + + // Now we set the character set and that's all + return $this->db_set_charset($this->char_set); + } + + // -------------------------------------------------------------------- + + /** + * DB connect + * + * This is just a dummy method that all drivers will override. + * + * @return mixed + */ + public function db_connect() + { + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @return mixed + */ + public function db_pconnect() + { + return $this->db_connect(TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout. + * + * This is just a dummy method to allow drivers without such + * functionality to not declare it, while others will override it. + * + * @return void + */ + public function reconnect() + { + } + + // -------------------------------------------------------------------- + + /** + * Select database + * + * This is just a dummy method to allow drivers without such + * functionality to not declare it, while others will override it. + * + * @return bool + */ + public function db_select() + { + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Last error + * + * @return array + */ + public function error() + { + return array('code' => NULL, 'message' => NULL); + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string + * @return bool + */ + public function db_set_charset($charset) + { + if (method_exists($this, '_db_set_charset') && ! $this->_db_set_charset($charset)) + { + log_message('error', 'Unable to set database connection charset: '.$charset); + + if ($this->db_debug) + { + $this->display_error('db_unable_to_set_charset', $charset); + } + + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * The name of the platform in use (mysql, mssql, etc...) + * + * @return string + */ + public function platform() + { + return $this->dbdriver; + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * Returns a string containing the version of the database being used. + * Most drivers will override this method. + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if (FALSE === ($sql = $this->_version())) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; + } + + $query = $this->query($sql)->row(); + return $this->data_cache['version'] = $query->ver; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @return string + */ + protected function _version() + { + return 'SELECT VERSION() AS ver'; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * Accepts an SQL string as input and returns a result object upon + * successful execution of a "read" type query. Returns boolean TRUE + * upon successful execution of a "write" type query. Returns boolean + * FALSE upon failure, and if the $db_debug variable is set to TRUE + * will raise an error. + * + * @param string $sql + * @param array $binds = FALSE An array of binding data + * @param bool $return_object = NULL + * @return mixed + */ + public function query($sql, $binds = FALSE, $return_object = NULL) + { + if ($sql === '') + { + log_message('error', 'Invalid query: '.$sql); + return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; + } + elseif ( ! is_bool($return_object)) + { + $return_object = ! $this->is_write_type($sql); + } + + // Verify table prefix and replace if necessary + if ($this->dbprefix !== '' && $this->swap_pre !== '' && $this->dbprefix !== $this->swap_pre) + { + $sql = preg_replace('/(\W)'.$this->swap_pre.'(\S+?)/', '\\1'.$this->dbprefix.'\\2', $sql); + } + + // Compile binds if needed + if ($binds !== FALSE) + { + $sql = $this->compile_binds($sql, $binds); + } + + // Is query caching enabled? If the query is a "read type" + // we will load the caching class and return the previously + // cached query if it exists + if ($this->cache_on === TRUE && $return_object === TRUE && $this->_cache_init()) + { + $this->load_rdriver(); + if (FALSE !== ($cache = $this->CACHE->read($sql))) + { + return $cache; + } + } + + // Save the query for debugging + if ($this->save_queries === TRUE) + { + $this->queries[] = $sql; + } + + // Start the Query Timer + $time_start = microtime(TRUE); + + // Run the Query + if (FALSE === ($this->result_id = $this->simple_query($sql))) + { + if ($this->save_queries === TRUE) + { + $this->query_times[] = 0; + } + + // This will trigger a rollback if transactions are being used + if ($this->_trans_depth !== 0) + { + $this->_trans_status = FALSE; + } + + // Grab the error now, as we might run some additional queries before displaying the error + $error = $this->error(); + + // Log errors + log_message('error', 'Query error: '.$error['message'].' - Invalid query: '.$sql); + + if ($this->db_debug) + { + // We call this function in order to roll-back queries + // if transactions are enabled. If we don't call this here + // the error message will trigger an exit, causing the + // transactions to remain in limbo. + while ($this->_trans_depth !== 0) + { + $trans_depth = $this->_trans_depth; + $this->trans_complete(); + if ($trans_depth === $this->_trans_depth) + { + log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); + break; + } + } + + // Display errors + return $this->display_error(array('Error Number: '.$error['code'], $error['message'], $sql)); + } + + return FALSE; + } + + // Stop and aggregate the query time results + $time_end = microtime(TRUE); + $this->benchmark += $time_end - $time_start; + + if ($this->save_queries === TRUE) + { + $this->query_times[] = $time_end - $time_start; + } + + // Increment the query counter + $this->query_count++; + + // Will we have a result object instantiated? If not - we'll simply return TRUE + if ($return_object !== TRUE) + { + // If caching is enabled we'll auto-cleanup any existing files related to this particular URI + if ($this->cache_on === TRUE && $this->cache_autodel === TRUE && $this->_cache_init()) + { + $this->CACHE->delete(); + } + + return TRUE; + } + + // Load and instantiate the result driver + $driver = $this->load_rdriver(); + $RES = new $driver($this); + + // Is query caching enabled? If so, we'll serialize the + // result object and save it to a cache file. + if ($this->cache_on === TRUE && $this->_cache_init()) + { + // We'll create a new instance of the result object + // only without the platform specific driver since + // we can't use it with cached data (the query result + // resource ID won't be any good once we've cached the + // result object, so we'll have to compile the data + // and save it) + $CR = new CI_DB_result($this); + $CR->result_object = $RES->result_object(); + $CR->result_array = $RES->result_array(); + $CR->num_rows = $RES->num_rows(); + + // Reset these since cached objects can not utilize resource IDs. + $CR->conn_id = NULL; + $CR->result_id = NULL; + + $this->CACHE->write($sql, $CR); + } + + return $RES; + } + + // -------------------------------------------------------------------- + + /** + * Load the result drivers + * + * @return string the name of the result class + */ + public function load_rdriver() + { + $driver = 'CI_DB_'.$this->dbdriver.'_result'; + + if ( ! class_exists($driver, FALSE)) + { + require_once(BASEPATH.'database/DB_result.php'); + require_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); + } + + return $driver; + } + + // -------------------------------------------------------------------- + + /** + * Simple Query + * This is a simplified version of the query() function. Internally + * we only use it when running transaction commands since they do + * not require all the features of the main query() function. + * + * @param string the sql query + * @return mixed + */ + public function simple_query($sql) + { + if ( ! $this->conn_id) + { + if ( ! $this->initialize()) + { + return FALSE; + } + } + + return $this->_execute($sql); + } + + // -------------------------------------------------------------------- + + /** + * Disable Transactions + * This permits transactions to be disabled at run-time. + * + * @return void + */ + public function trans_off() + { + $this->trans_enabled = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Enable/disable Transaction Strict Mode + * + * When strict mode is enabled, if you are running multiple groups of + * transactions, if one group fails all subsequent groups will be + * rolled back. + * + * If strict mode is disabled, each group is treated autonomously, + * meaning a failure of one group will not affect any others + * + * @param bool $mode = TRUE + * @return void + */ + public function trans_strict($mode = TRUE) + { + $this->trans_strict = is_bool($mode) ? $mode : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Start Transaction + * + * @param bool $test_mode = FALSE + * @return bool + */ + public function trans_start($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return FALSE; + } + + return $this->trans_begin($test_mode); + } + + // -------------------------------------------------------------------- + + /** + * Complete Transaction + * + * @return bool + */ + public function trans_complete() + { + if ( ! $this->trans_enabled) + { + return FALSE; + } + + // The query() function will set this flag to FALSE in the event that a query failed + if ($this->_trans_status === FALSE OR $this->_trans_failure === TRUE) + { + $this->trans_rollback(); + + // If we are NOT running in strict mode, we will reset + // the _trans_status flag so that subsequent groups of + // transactions will be permitted. + if ($this->trans_strict === FALSE) + { + $this->_trans_status = TRUE; + } + + log_message('debug', 'DB Transaction Failure'); + return FALSE; + } + + return $this->trans_commit(); + } + + // -------------------------------------------------------------------- + + /** + * Lets you retrieve the transaction flag to determine if it has failed + * + * @return bool + */ + public function trans_status() + { + return $this->_trans_status; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @param bool $test_mode + * @return bool + */ + public function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return FALSE; + } + // When transactions are nested we only begin/commit/rollback the outermost ones + elseif ($this->_trans_depth > 0) + { + $this->_trans_depth++; + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE); + + if ($this->_trans_begin()) + { + $this->_trans_status = TRUE; + $this->_trans_depth++; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + public function trans_commit() + { + if ( ! $this->trans_enabled OR $this->_trans_depth === 0) + { + return FALSE; + } + // When transactions are nested we only begin/commit/rollback the outermost ones + elseif ($this->_trans_depth > 1 OR $this->_trans_commit()) + { + $this->_trans_depth--; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + public function trans_rollback() + { + if ( ! $this->trans_enabled OR $this->_trans_depth === 0) + { + return FALSE; + } + // When transactions are nested we only begin/commit/rollback the outermost ones + elseif ($this->_trans_depth > 1 OR $this->_trans_rollback()) + { + $this->_trans_depth--; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Compile Bindings + * + * @param string the sql statement + * @param array an array of bind data + * @return string + */ + public function compile_binds($sql, $binds) + { + if (empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) + { + return $sql; + } + elseif ( ! is_array($binds)) + { + $binds = array($binds); + $bind_count = 1; + } + else + { + // Make sure we're using numeric keys + $binds = array_values($binds); + $bind_count = count($binds); + } + + // We'll need the marker length later + $ml = strlen($this->bind_marker); + + // Make sure not to replace a chunk inside a string that happens to match the bind marker + if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) + { + $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', + str_replace($matches[0], + str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), + $sql, $c), + $matches, PREG_OFFSET_CAPTURE); + + // Bind values' count must match the count of markers in the query + if ($bind_count !== $c) + { + return $sql; + } + } + elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) + { + return $sql; + } + + do + { + $c--; + $escaped_value = $this->escape($binds[$c]); + if (is_array($escaped_value)) + { + $escaped_value = '('.implode(',', $escaped_value).')'; + } + $sql = substr_replace($sql, $escaped_value, $matches[0][$c][1], $ml); + } + while ($c !== 0); + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX|MERGE)\s/i', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Calculate the aggregate query elapsed time + * + * @param int The number of decimal places + * @return string + */ + public function elapsed_time($decimals = 6) + { + return number_format($this->benchmark, $decimals); + } + + // -------------------------------------------------------------------- + + /** + * Returns the total number of queries + * + * @return int + */ + public function total_queries() + { + return $this->query_count; + } + + // -------------------------------------------------------------------- + + /** + * Returns the last query that was executed + * + * @return string + */ + public function last_query() + { + return end($this->queries); + } + + // -------------------------------------------------------------------- + + /** + * "Smart" Escape String + * + * Escapes data based on type + * Sets boolean and null types + * + * @param string + * @return mixed + */ + public function escape($str) + { + if (is_array($str)) + { + $str = array_map(array(&$this, 'escape'), $str); + return $str; + } + elseif (is_string($str) OR (is_object($str) && method_exists($str, '__toString'))) + { + return "'".$this->escape_str($str)."'"; + } + elseif (is_bool($str)) + { + return ($str === FALSE) ? 0 : 1; + } + elseif ($str === NULL) + { + return 'NULL'; + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @param string|string[] $str Input string + * @param bool $like Whether or not the string will be used in a LIKE condition + * @return string + */ + public function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + $str = $this->_escape_str($str); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + return str_replace( + array($this->_like_escape_chr, '%', '_'), + array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'), + $str + ); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Escape LIKE String + * + * Calls the individual driver for platform + * specific escaping for LIKE conditions + * + * @param string|string[] + * @return mixed + */ + public function escape_like_str($str) + { + return $this->escape_str($str, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependent string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return str_replace("'", "''", remove_invisible_characters($str, FALSE)); + } + + // -------------------------------------------------------------------- + + /** + * Primary + * + * Retrieves the primary key. It assumes that the row in the first + * position is the primary key + * + * @param string $table Table name + * @return string + */ + public function primary($table) + { + $fields = $this->list_fields($table); + return is_array($fields) ? current($fields) : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @param string + * @return int + */ + public function count_all($table = '') + { + if ($table === '') + { + return 0; + } + + $query = $this->query($this->_count_string.$this->escape_identifiers('numrows').' FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE)); + if ($query->num_rows() === 0) + { + return 0; + } + + $query = $query->row(); + $this->_reset_select(); + return (int) $query->numrows; + } + + // -------------------------------------------------------------------- + + /** + * Returns an array of table names + * + * @param string $constrain_by_prefix = FALSE + * @return array + */ + public function list_tables($constrain_by_prefix = FALSE) + { + // Is there a cached result? + if (isset($this->data_cache['table_names'])) + { + return $this->data_cache['table_names']; + } + + if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix))) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; + } + + $this->data_cache['table_names'] = array(); + $query = $this->query($sql); + + foreach ($query->result_array() as $row) + { + // Do we know from which column to get the table name? + if ( ! isset($key)) + { + if (isset($row['table_name'])) + { + $key = 'table_name'; + } + elseif (isset($row['TABLE_NAME'])) + { + $key = 'TABLE_NAME'; + } + else + { + /* We have no other choice but to just get the first element's key. + * Due to array_shift() accepting its argument by reference, if + * E_STRICT is on, this would trigger a warning. So we'll have to + * assign it first. + */ + $key = array_keys($row); + $key = array_shift($key); + } + } + + $this->data_cache['table_names'][] = $row[$key]; + } + + return $this->data_cache['table_names']; + } + + // -------------------------------------------------------------------- + + /** + * Determine if a particular table exists + * + * @param string $table_name + * @return bool + */ + public function table_exists($table_name) + { + return in_array($this->protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables()); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * @param string $table Table name + * @return array + */ + public function list_fields($table) + { + // Is there a cached result? + if (isset($this->data_cache['field_names'][$table])) + { + return $this->data_cache['field_names'][$table]; + } + + if (FALSE === ($sql = $this->_list_columns($table))) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; + } + + $query = $this->query($sql); + $this->data_cache['field_names'][$table] = array(); + + foreach ($query->result_array() as $row) + { + // Do we know from where to get the column's name? + if ( ! isset($key)) + { + if (isset($row['column_name'])) + { + $key = 'column_name'; + } + elseif (isset($row['COLUMN_NAME'])) + { + $key = 'COLUMN_NAME'; + } + else + { + // We have no other choice but to just get the first element's key. + $key = key($row); + } + } + + $this->data_cache['field_names'][$table][] = $row[$key]; + } + + return $this->data_cache['field_names'][$table]; + } + + // -------------------------------------------------------------------- + + /** + * Determine if a particular field exists + * + * @param string + * @param string + * @return bool + */ + public function field_exists($field_name, $table_name) + { + return in_array($field_name, $this->list_fields($table_name)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table the table name + * @return array + */ + public function field_data($table) + { + $query = $this->query($this->_field_data($this->protect_identifiers($table, TRUE, NULL, FALSE))); + return ($query) ? $query->field_data() : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @param mixed + * @return mixed + */ + public function escape_identifiers($item) + { + if ($this->_escape_char === '' OR empty($item) OR in_array($item, $this->_reserved_identifiers)) + { + return $item; + } + elseif (is_array($item)) + { + foreach ($item as $key => $value) + { + $item[$key] = $this->escape_identifiers($value); + } + + return $item; + } + // Avoid breaking functions and literal values inside queries + elseif (ctype_digit($item) OR $item[0] === "'" OR ($this->_escape_char !== '"' && $item[0] === '"') OR strpos($item, '(') !== FALSE) + { + return $item; + } + + static $preg_ec = array(); + + if (empty($preg_ec)) + { + if (is_array($this->_escape_char)) + { + $preg_ec = array( + preg_quote($this->_escape_char[0], '/'), + preg_quote($this->_escape_char[1], '/'), + $this->_escape_char[0], + $this->_escape_char[1] + ); + } + else + { + $preg_ec[0] = $preg_ec[1] = preg_quote($this->_escape_char, '/'); + $preg_ec[2] = $preg_ec[3] = $this->_escape_char; + } + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?\./i', $preg_ec[2].'$1'.$preg_ec[3].'.', $item); + } + } + + return preg_replace('/'.$preg_ec[0].'?([^'.$preg_ec[1].'\.]+)'.$preg_ec[1].'?(\.)?/i', $preg_ec[2].'$1'.$preg_ec[3].'$2', $item); + } + + // -------------------------------------------------------------------- + + /** + * Generate an insert string + * + * @param string the table upon which the query will be performed + * @param array an associative array data of key/values + * @return string + */ + public function insert_string($table, $data) + { + $fields = $values = array(); + + foreach ($data as $key => $val) + { + $fields[] = $this->escape_identifiers($key); + $values[] = $this->escape($val); + } + + return $this->_insert($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values); + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + protected function _insert($table, $keys, $values) + { + return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; + } + + // -------------------------------------------------------------------- + + /** + * Generate an update string + * + * @param string the table upon which the query will be performed + * @param array an associative array data of key/values + * @param mixed the "where" statement + * @return string + */ + public function update_string($table, $data, $where) + { + if (empty($where)) + { + return FALSE; + } + + $this->where($where); + + $fields = array(); + foreach ($data as $key => $val) + { + $fields[$this->protect_identifiers($key)] = $this->escape($val); + } + + $sql = $this->_update($this->protect_identifiers($table, TRUE, NULL, FALSE), $fields); + $this->_reset_write(); + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string the table name + * @param array the update data + * @return string + */ + protected function _update($table, $values) + { + foreach ($values as $key => $val) + { + $valstr[] = $key.' = '.$val; + } + + return 'UPDATE '.$table.' SET '.implode(', ', $valstr) + .$this->_compile_wh('qb_where') + .$this->_compile_order_by() + .($this->qb_limit !== FALSE ? ' LIMIT '.$this->qb_limit : ''); + } + + // -------------------------------------------------------------------- + + /** + * Tests whether the string has an SQL operator + * + * @param string + * @return bool + */ + protected function _has_operator($str) + { + return (bool) preg_match('/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str)); + } + + // -------------------------------------------------------------------- + + /** + * Returns the SQL string operator + * + * @param string + * @return string + */ + protected function _get_operator($str) + { + static $_operators; + + if (empty($_operators)) + { + $_les = ($this->_like_escape_str !== '') + ? '\s+'.preg_quote(trim(sprintf($this->_like_escape_str, $this->_like_escape_chr)), '/') + : ''; + $_operators = array( + '\s*(?:<|>|!)?=\s*', // =, <=, >=, != + '\s*<>?\s*', // <, <> + '\s*>\s*', // > + '\s+IS NULL', // IS NULL + '\s+IS NOT NULL', // IS NOT NULL + '\s+EXISTS\s*\(.*\)', // EXISTS(sql) + '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) + '\s+BETWEEN\s+', // BETWEEN value AND value + '\s+IN\s*\(.*\)', // IN(list) + '\s+NOT IN\s*\(.*\)', // NOT IN (list) + '\s+LIKE\s+\S.*('.$_les.')?', // LIKE 'expr'[ ESCAPE '%s'] + '\s+NOT LIKE\s+\S.*('.$_les.')?' // NOT LIKE 'expr'[ ESCAPE '%s'] + ); + + } + + return preg_match('/'.implode('|', $_operators).'/i', $str, $match) + ? $match[0] : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Enables a native PHP function to be run, using a platform agnostic wrapper. + * + * @param string $function Function name + * @return mixed + */ + public function call_function($function) + { + $driver = ($this->dbdriver === 'postgre') ? 'pg_' : $this->dbdriver.'_'; + + if (FALSE === strpos($driver, $function)) + { + $function = $driver.$function; + } + + if ( ! function_exists($function)) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_function') : FALSE; + } + + return (func_num_args() > 1) + ? call_user_func_array($function, array_slice(func_get_args(), 1)) + : call_user_func($function); + } + + // -------------------------------------------------------------------- + + /** + * Set Cache Directory Path + * + * @param string the path to the cache directory + * @return void + */ + public function cache_set_path($path = '') + { + $this->cachedir = $path; + } + + // -------------------------------------------------------------------- + + /** + * Enable Query Caching + * + * @return bool cache_on value + */ + public function cache_on() + { + return $this->cache_on = TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Disable Query Caching + * + * @return bool cache_on value + */ + public function cache_off() + { + return $this->cache_on = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Delete the cache files associated with a particular URI + * + * @param string $segment_one = '' + * @param string $segment_two = '' + * @return bool + */ + public function cache_delete($segment_one = '', $segment_two = '') + { + return $this->_cache_init() + ? $this->CACHE->delete($segment_one, $segment_two) + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Delete All cache files + * + * @return bool + */ + public function cache_delete_all() + { + return $this->_cache_init() + ? $this->CACHE->delete_all() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Initialize the Cache Class + * + * @return bool + */ + protected function _cache_init() + { + if ( ! class_exists('CI_DB_Cache', FALSE)) + { + require_once(BASEPATH.'database/DB_cache.php'); + } + elseif (is_object($this->CACHE)) + { + return TRUE; + } + + $this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + public function close() + { + if ($this->conn_id) + { + $this->_close(); + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * This method would be overridden by most of the drivers. + * + * @return void + */ + protected function _close() + { + $this->conn_id = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Display an error message + * + * @param string the error message + * @param string any "swap" values + * @param bool whether to localize the message + * @return string sends the application/views/errors/error_db.php template + */ + public function display_error($error = '', $swap = '', $native = FALSE) + { + $LANG =& load_class('Lang', 'core'); + $LANG->load('db'); + + $heading = $LANG->line('db_error_heading'); + + if ($native === TRUE) + { + $message = (array) $error; + } + else + { + $message = is_array($error) ? $error : array(str_replace('%s', $swap, $LANG->line($error))); + } + + // Find the most likely culprit of the error by going through + // the backtrace until the source file is no longer in the + // database folder. + $trace = debug_backtrace(); + foreach ($trace as $call) + { + if (isset($call['file'], $call['class'])) + { + // We'll need this on Windows, as APPPATH and BASEPATH will always use forward slashes + if (DIRECTORY_SEPARATOR !== '/') + { + $call['file'] = str_replace('\\', '/', $call['file']); + } + + if (strpos($call['file'], BASEPATH.'database') === FALSE && strpos($call['class'], 'Loader') === FALSE) + { + // Found it - use a relative path for safety + $message[] = 'Filename: '.str_replace(array(APPPATH, BASEPATH), '', $call['file']); + $message[] = 'Line Number: '.$call['line']; + break; + } + } + } + + $error =& load_class('Exceptions', 'core'); + echo $error->show_error($heading, $message, 'error_db'); + exit(8); // EXIT_DATABASE + } + + // -------------------------------------------------------------------- + + /** + * Protect Identifiers + * + * This function is used extensively by the Query Builder class, and by + * a couple functions in this class. + * It takes a column or table name (optionally with an alias) and inserts + * the table prefix onto it. Some logic is necessary in order to deal with + * column names that include the path. Consider a query like this: + * + * SELECT hostname.database.table.column AS c FROM hostname.database.table + * + * Or a query with aliasing: + * + * SELECT m.member_id, m.member_name FROM members AS m + * + * Since the column name can include up to four segments (host, DB, table, column) + * or also have an alias prefix, we need to do a bit of work to figure this out and + * insert the table prefix (if it exists) in the proper position, and escape only + * the correct identifiers. + * + * @param string + * @param bool + * @param mixed + * @param bool + * @return string + */ + public function protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) + { + if ( ! is_bool($protect_identifiers)) + { + $protect_identifiers = $this->_protect_identifiers; + } + + if (is_array($item)) + { + $escaped_array = array(); + foreach ($item as $k => $v) + { + $escaped_array[$this->protect_identifiers($k)] = $this->protect_identifiers($v, $prefix_single, $protect_identifiers, $field_exists); + } + + return $escaped_array; + } + + // This is basically a bug fix for queries that use MAX, MIN, etc. + // If a parenthesis is found we know that we do not need to + // escape the data or add a prefix. There's probably a more graceful + // way to deal with this, but I'm not thinking of it -- Rick + // + // Added exception for single quotes as well, we don't want to alter + // literal strings. -- Narf + if (strcspn($item, "()'") !== strlen($item)) + { + return $item; + } + + // Convert tabs or multiple spaces into single spaces + $item = preg_replace('/\s+/', ' ', trim($item)); + + // If the item has an alias declaration we remove it and set it aside. + // Note: strripos() is used in order to support spaces in table names + if ($offset = strripos($item, ' AS ')) + { + $alias = ($protect_identifiers) + ? substr($item, $offset, 4).$this->escape_identifiers(substr($item, $offset + 4)) + : substr($item, $offset); + $item = substr($item, 0, $offset); + } + elseif ($offset = strrpos($item, ' ')) + { + $alias = ($protect_identifiers) + ? ' '.$this->escape_identifiers(substr($item, $offset + 1)) + : substr($item, $offset); + $item = substr($item, 0, $offset); + } + else + { + $alias = ''; + } + + // Break the string apart if it contains periods, then insert the table prefix + // in the correct location, assuming the period doesn't indicate that we're dealing + // with an alias. While we're at it, we will escape the components + if (strpos($item, '.') !== FALSE) + { + $parts = explode('.', $item); + + // Does the first segment of the exploded item match + // one of the aliases previously identified? If so, + // we have nothing more to do other than escape the item + // + // NOTE: The ! empty() condition prevents this method + // from breaking when QB isn't enabled. + if ( ! empty($this->qb_aliased_tables) && in_array($parts[0], $this->qb_aliased_tables)) + { + if ($protect_identifiers === TRUE) + { + foreach ($parts as $key => $val) + { + if ( ! in_array($val, $this->_reserved_identifiers)) + { + $parts[$key] = $this->escape_identifiers($val); + } + } + + $item = implode('.', $parts); + } + + return $item.$alias; + } + + // Is there a table prefix defined in the config file? If not, no need to do anything + if ($this->dbprefix !== '') + { + // We now add the table prefix based on some logic. + // Do we have 4 segments (hostname.database.table.column)? + // If so, we add the table prefix to the column name in the 3rd segment. + if (isset($parts[3])) + { + $i = 2; + } + // Do we have 3 segments (database.table.column)? + // If so, we add the table prefix to the column name in 2nd position + elseif (isset($parts[2])) + { + $i = 1; + } + // Do we have 2 segments (table.column)? + // If so, we add the table prefix to the column name in 1st segment + else + { + $i = 0; + } + + // This flag is set when the supplied $item does not contain a field name. + // This can happen when this function is being called from a JOIN. + if ($field_exists === FALSE) + { + $i++; + } + + // dbprefix may've already been applied, with or without the identifier escaped + $ec = '(?'.preg_quote(is_array($this->_escape_char) ? $this->_escape_char[0] : $this->_escape_char).')?'; + isset($ec[0]) && $ec .= '?'; // Just in case someone has disabled escaping by forcing an empty escape character + + // Verify table prefix and replace if necessary + if ($this->swap_pre !== '' && preg_match('#^'.$ec.preg_quote($this->swap_pre).'#', $parts[$i])) + { + $parts[$i] = preg_replace('#^'.$ec.preg_quote($this->swap_pre).'(\S+?)#', '\\1'.$this->dbprefix.'\\2', $parts[$i]); + } + // We only add the table prefix if it does not already exist + else + { + preg_match('#^'.$ec.preg_quote($this->dbprefix).'#', $parts[$i]) OR $parts[$i] = $this->dbprefix.$parts[$i]; + } + + // Put the parts back together + $item = implode('.', $parts); + } + + if ($protect_identifiers === TRUE) + { + $item = $this->escape_identifiers($item); + } + + return $item.$alias; + } + + // Is there a table prefix? If not, no need to insert it + if ($this->dbprefix !== '') + { + // Verify table prefix and replace if necessary + if ($this->swap_pre !== '' && strpos($item, $this->swap_pre) === 0) + { + $item = preg_replace('/^'.$this->swap_pre.'(\S+?)/', $this->dbprefix.'\\1', $item); + } + // Do we prefix an item with no segments? + elseif ($prefix_single === TRUE && strpos($item, $this->dbprefix) !== 0) + { + $item = $this->dbprefix.$item; + } + } + + if ($protect_identifiers === TRUE && ! in_array($item, $this->_reserved_identifiers)) + { + $item = $this->escape_identifiers($item); + } + + return $item.$alias; + } + + // -------------------------------------------------------------------- + + /** + * Dummy method that allows Query Builder class to be disabled + * and keep count_all() working. + * + * @return void + */ + protected function _reset_select() + { + } + +} diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php new file mode 100644 index 0000000..d3057dc --- /dev/null +++ b/system/database/DB_forge.php @@ -0,0 +1,1030 @@ +db =& $db; + log_message('info', 'Database Forge Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name + * @return bool + */ + public function create_database($db_name) + { + if ($this->_create_database === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + elseif ( ! $this->db->query(sprintf($this->_create_database, $this->db->escape_identifiers($db_name), $this->db->char_set, $this->db->dbcollat))) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + if ( ! empty($this->db->data_cache['db_names'])) + { + $this->db->data_cache['db_names'][] = $db_name; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name + * @return bool + */ + public function drop_database($db_name) + { + if ($this->_drop_database === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + elseif ( ! $this->db->query(sprintf($this->_drop_database, $this->db->escape_identifiers($db_name)))) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + if ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($db_name), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Add Key + * + * @param string $key + * @param bool $primary + * @return CI_DB_forge + */ + public function add_key($key, $primary = FALSE) + { + // DO NOT change this! This condition is only applicable + // for PRIMARY keys because you can only have one such, + // and therefore all fields you add to it will be included + // in the same, composite PRIMARY KEY. + // + // It's not the same for regular indexes. + if ($primary === TRUE && is_array($key)) + { + foreach ($key as $one) + { + $this->add_key($one, $primary); + } + + return $this; + } + + if ($primary === TRUE) + { + $this->primary_keys[] = $key; + } + else + { + $this->keys[] = $key; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Add Field + * + * @param array $field + * @return CI_DB_forge + */ + public function add_field($field) + { + if (is_string($field)) + { + if ($field === 'id') + { + $this->add_field(array( + 'id' => array( + 'type' => 'INT', + 'constraint' => 9, + 'auto_increment' => TRUE + ) + )); + $this->add_key('id', TRUE); + } + else + { + if (strpos($field, ' ') === FALSE) + { + show_error('Field information is required for that operation.'); + } + + $this->fields[] = $field; + } + } + + if (is_array($field)) + { + $this->fields = array_merge($this->fields, $field); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @param string $table Table name + * @param bool $if_not_exists Whether to add IF NOT EXISTS condition + * @param array $attributes Associative array of table attributes + * @return bool + */ + public function create_table($table, $if_not_exists = FALSE, array $attributes = array()) + { + if ($table === '') + { + show_error('A table name is required for that operation.'); + } + else + { + $table = $this->db->dbprefix.$table; + } + + if (count($this->fields) === 0) + { + show_error('Field information is required.'); + } + + $sql = $this->_create_table($table, $if_not_exists, $attributes); + + if (is_bool($sql)) + { + $this->_reset(); + if ($sql === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + } + + if (($result = $this->db->query($sql)) !== FALSE) + { + isset($this->db->data_cache['table_names']) && $this->db->data_cache['table_names'][] = $table; + + // Most databases don't support creating indexes from within the CREATE TABLE statement + if ( ! empty($this->keys)) + { + for ($i = 0, $sqls = $this->_process_indexes($table), $c = count($sqls); $i < $c; $i++) + { + $this->db->query($sqls[$i]); + } + } + } + + $this->_reset(); + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @param string $table Table name + * @param bool $if_not_exists Whether to add 'IF NOT EXISTS' condition + * @param array $attributes Associative array of table attributes + * @return mixed + */ + protected function _create_table($table, $if_not_exists, $attributes) + { + if ($if_not_exists === TRUE && $this->_create_table_if === FALSE) + { + if ($this->db->table_exists($table)) + { + return TRUE; + } + + $if_not_exists = FALSE; + } + + $sql = ($if_not_exists) + ? sprintf($this->_create_table_if, $this->db->escape_identifiers($table)) + : 'CREATE TABLE'; + + $columns = $this->_process_fields(TRUE); + for ($i = 0, $c = count($columns); $i < $c; $i++) + { + $columns[$i] = ($columns[$i]['_literal'] !== FALSE) + ? "\n\t".$columns[$i]['_literal'] + : "\n\t".$this->_process_column($columns[$i]); + } + + $columns = implode(',', $columns) + .$this->_process_primary_keys($table); + + // Are indexes created from within the CREATE TABLE statement? (e.g. in MySQL) + if ($this->_create_table_keys === TRUE) + { + $columns .= $this->_process_indexes($table); + } + + // _create_table will usually have the following format: "%s %s (%s\n)" + $sql = sprintf($this->_create_table.'%s', + $sql, + $this->db->escape_identifiers($table), + $columns, + $this->_create_table_attr($attributes) + ); + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * CREATE TABLE attributes + * + * @param array $attributes Associative array of table attributes + * @return string + */ + protected function _create_table_attr($attributes) + { + $sql = ''; + + foreach (array_keys($attributes) as $key) + { + if (is_string($key)) + { + $sql .= ' '.strtoupper($key).' '.$attributes[$key]; + } + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @param string $table_name Table name + * @param bool $if_exists Whether to add an IF EXISTS condition + * @return bool + */ + public function drop_table($table_name, $if_exists = FALSE) + { + if ($table_name === '') + { + return ($this->db->db_debug) ? $this->db->display_error('db_table_name_required') : FALSE; + } + + if (($query = $this->_drop_table($this->db->dbprefix.$table_name, $if_exists)) === TRUE) + { + return TRUE; + } + + $query = $this->db->query($query); + + // Update table list cache + if ($query && ! empty($this->db->data_cache['table_names'])) + { + $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['table_names'][$key]); + } + } + + return $query; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * Generates a platform-specific DROP TABLE string + * + * @param string $table Table name + * @param bool $if_exists Whether to add an IF EXISTS condition + * @return mixed (Returns a platform-specific DROP table string, or TRUE to indicate there's nothing to do) + */ + protected function _drop_table($table, $if_exists) + { + $sql = 'DROP TABLE'; + + if ($if_exists) + { + if ($this->_drop_table_if === FALSE) + { + if ( ! $this->db->table_exists($table)) + { + return TRUE; + } + } + else + { + $sql = sprintf($this->_drop_table_if, $this->db->escape_identifiers($table)); + } + } + + return $sql.' '.$this->db->escape_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Rename Table + * + * @param string $table_name Old table name + * @param string $new_table_name New table name + * @return bool + */ + public function rename_table($table_name, $new_table_name) + { + if ($table_name === '' OR $new_table_name === '') + { + show_error('A table name is required for that operation.'); + return FALSE; + } + elseif ($this->_rename_table === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $result = $this->db->query(sprintf($this->_rename_table, + $this->db->escape_identifiers($this->db->dbprefix.$table_name), + $this->db->escape_identifiers($this->db->dbprefix.$new_table_name)) + ); + + if ($result && ! empty($this->db->data_cache['table_names'])) + { + $key = array_search(strtolower($this->db->dbprefix.$table_name), array_map('strtolower', $this->db->data_cache['table_names']), TRUE); + if ($key !== FALSE) + { + $this->db->data_cache['table_names'][$key] = $this->db->dbprefix.$new_table_name; + } + } + + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Column Add + * + * @todo Remove deprecated $_after option in 3.1+ + * @param string $table Table name + * @param array $field Column definition + * @param string $_after Column for AFTER clause (deprecated) + * @return bool + */ + public function add_column($table, $field, $_after = NULL) + { + // Work-around for literal column definitions + is_array($field) OR $field = array($field); + + foreach (array_keys($field) as $k) + { + // Backwards-compatibility work-around for MySQL/CUBRID AFTER clause (remove in 3.1+) + if ($_after !== NULL && is_array($field[$k]) && ! isset($field[$k]['after'])) + { + $field[$k]['after'] = $_after; + } + + $this->add_field(array($k => $field[$k])); + } + + $sqls = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->_process_fields()); + $this->_reset(); + if ($sqls === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + for ($i = 0, $c = count($sqls); $i < $c; $i++) + { + if ($this->db->query($sqls[$i]) === FALSE) + { + return FALSE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Column Drop + * + * @param string $table Table name + * @param string $column_name Column name + * @return bool + */ + public function drop_column($table, $column_name) + { + $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name); + if ($sql === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + return $this->db->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Column Modify + * + * @param string $table Table name + * @param string $field Column definition + * @return bool + */ + public function modify_column($table, $field) + { + // Work-around for literal column definitions + is_array($field) OR $field = array($field); + + foreach (array_keys($field) as $k) + { + $this->add_field(array($k => $field[$k])); + } + + if (count($this->fields) === 0) + { + show_error('Field information is required.'); + } + + $sqls = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->_process_fields()); + $this->_reset(); + if ($sqls === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + for ($i = 0, $c = count($sqls); $i < $c; $i++) + { + if ($this->db->query($sqls[$i]) === FALSE) + { + return FALSE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' '; + + // DROP has everything it needs now. + if ($alter_type === 'DROP') + { + return $sql.'DROP COLUMN '.$this->db->escape_identifiers($field); + } + + $sql .= ($alter_type === 'ADD') + ? 'ADD ' + : $alter_type.' COLUMN '; + + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql + .($field[$i]['_literal'] !== FALSE ? $field[$i]['_literal'] : $this->_process_column($field[$i])); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process fields + * + * @param bool $create_table + * @return array + */ + protected function _process_fields($create_table = FALSE) + { + $fields = array(); + + foreach ($this->fields as $key => $attributes) + { + if (is_int($key) && ! is_array($attributes)) + { + $fields[] = array('_literal' => $attributes); + continue; + } + + $attributes = array_change_key_case($attributes, CASE_UPPER); + + if ($create_table === TRUE && empty($attributes['TYPE'])) + { + continue; + } + + isset($attributes['TYPE']) && $this->_attr_type($attributes); + + $field = array( + 'name' => $key, + 'new_name' => isset($attributes['NAME']) ? $attributes['NAME'] : NULL, + 'type' => isset($attributes['TYPE']) ? $attributes['TYPE'] : NULL, + 'length' => '', + 'unsigned' => '', + 'null' => '', + 'unique' => '', + 'default' => '', + 'auto_increment' => '', + '_literal' => FALSE + ); + + isset($attributes['TYPE']) && $this->_attr_unsigned($attributes, $field); + + if ($create_table === FALSE) + { + if (isset($attributes['AFTER'])) + { + $field['after'] = $attributes['AFTER']; + } + elseif (isset($attributes['FIRST'])) + { + $field['first'] = (bool) $attributes['FIRST']; + } + } + + $this->_attr_default($attributes, $field); + + if (isset($attributes['NULL'])) + { + if ($attributes['NULL'] === TRUE) + { + $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; + } + else + { + $field['null'] = ' NOT NULL'; + } + } + elseif ($create_table === TRUE) + { + $field['null'] = ' NOT NULL'; + } + + $this->_attr_auto_increment($attributes, $field); + $this->_attr_unique($attributes, $field); + + if (isset($attributes['COMMENT'])) + { + $field['comment'] = $this->db->escape($attributes['COMMENT']); + } + + if (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT'])) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'ENUM': + case 'SET': + $attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']); + default: + $field['length'] = is_array($attributes['CONSTRAINT']) + ? '('.implode(',', $attributes['CONSTRAINT']).')' + : '('.$attributes['CONSTRAINT'].')'; + break; + } + } + + $fields[] = $field; + } + + return $fields; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['default'] + .$field['null'] + .$field['auto_increment'] + .$field['unique']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + // Usually overridden by drivers + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNSIGNED + * + * Depending on the _unsigned property value: + * + * - TRUE will always set $field['unsigned'] to 'UNSIGNED' + * - FALSE will always set $field['unsigned'] to '' + * - array(TYPE) will set $field['unsigned'] to 'UNSIGNED', + * if $attributes['TYPE'] is found in the array + * - array(TYPE => UTYPE) will change $field['type'], + * from TYPE to UTYPE in case of a match + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unsigned(&$attributes, &$field) + { + if (empty($attributes['UNSIGNED']) OR $attributes['UNSIGNED'] !== TRUE) + { + return; + } + + // Reset the attribute in order to avoid issues if we do type conversion + $attributes['UNSIGNED'] = FALSE; + + if (is_array($this->_unsigned)) + { + foreach (array_keys($this->_unsigned) as $key) + { + if (is_int($key) && strcasecmp($attributes['TYPE'], $this->_unsigned[$key]) === 0) + { + $field['unsigned'] = ' UNSIGNED'; + return; + } + elseif (is_string($key) && strcasecmp($attributes['TYPE'], $key) === 0) + { + $field['type'] = $key; + return; + } + } + + return; + } + + $field['unsigned'] = ($this->_unsigned === TRUE) ? ' UNSIGNED' : ''; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute DEFAULT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_default(&$attributes, &$field) + { + if ($this->_default === FALSE) + { + return; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + if ($attributes['DEFAULT'] === NULL) + { + $field['default'] = empty($this->_null) ? '' : $this->_default.$this->_null; + + // Override the NULL attribute if that's our default + $attributes['NULL'] = TRUE; + $field['null'] = empty($this->_null) ? '' : ' '.$this->_null; + } + else + { + $field['default'] = $this->_default.$this->db->escape($attributes['DEFAULT']); + } + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNIQUE + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unique(&$attributes, &$field) + { + if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) + { + $field['unique'] = ' UNIQUE'; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' AUTO_INCREMENT'; + } + } + + // -------------------------------------------------------------------- + + /** + * Process primary keys + * + * @param string $table Table name + * @return string + */ + protected function _process_primary_keys($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->primary_keys); $i < $c; $i++) + { + if ( ! isset($this->fields[$this->primary_keys[$i]])) + { + unset($this->primary_keys[$i]); + } + } + + if (count($this->primary_keys) > 0) + { + $sql .= ",\n\tCONSTRAINT ".$this->db->escape_identifiers('pk_'.$table) + .' PRIMARY KEY('.implode(', ', $this->db->escape_identifiers($this->primary_keys)).')'; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table Table name + * @return string[] list of SQL statements + */ + protected function _process_indexes($table) + { + $sqls = array(); + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sqls[] = 'CREATE INDEX '.$this->db->escape_identifiers($table.'_'.implode('_', $this->keys[$i])) + .' ON '.$this->db->escape_identifiers($table) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).');'; + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Reset + * + * Resets table creation vars + * + * @return void + */ + protected function _reset() + { + $this->fields = $this->keys = $this->primary_keys = array(); + } + +} diff --git a/system/database/DB_query_builder.php b/system/database/DB_query_builder.php new file mode 100644 index 0000000..3d0c329 --- /dev/null +++ b/system/database/DB_query_builder.php @@ -0,0 +1,2808 @@ +_protect_identifiers; + + foreach ($select as $val) + { + $val = trim($val); + + if ($val !== '') + { + $this->qb_select[] = $val; + $this->qb_no_escape[] = $escape; + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_select[] = $val; + $this->qb_cache_exists[] = 'select'; + $this->qb_cache_no_escape[] = $escape; + } + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Select Max + * + * Generates a SELECT MAX(field) portion of a query + * + * @param string the field + * @param string an alias + * @return CI_DB_query_builder + */ + public function select_max($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'MAX'); + } + + // -------------------------------------------------------------------- + + /** + * Select Min + * + * Generates a SELECT MIN(field) portion of a query + * + * @param string the field + * @param string an alias + * @return CI_DB_query_builder + */ + public function select_min($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'MIN'); + } + + // -------------------------------------------------------------------- + + /** + * Select Average + * + * Generates a SELECT AVG(field) portion of a query + * + * @param string the field + * @param string an alias + * @return CI_DB_query_builder + */ + public function select_avg($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'AVG'); + } + + // -------------------------------------------------------------------- + + /** + * Select Sum + * + * Generates a SELECT SUM(field) portion of a query + * + * @param string the field + * @param string an alias + * @return CI_DB_query_builder + */ + public function select_sum($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'SUM'); + } + + // -------------------------------------------------------------------- + + /** + * SELECT [MAX|MIN|AVG|SUM]() + * + * @used-by select_max() + * @used-by select_min() + * @used-by select_avg() + * @used-by select_sum() + * + * @param string $select Field name + * @param string $alias + * @param string $type + * @return CI_DB_query_builder + */ + protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') + { + if ( ! is_string($select) OR $select === '') + { + $this->display_error('db_invalid_query'); + } + + $type = strtoupper($type); + + if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM'))) + { + show_error('Invalid function type: '.$type); + } + + if ($alias === '') + { + $alias = $this->_create_alias_from_table(trim($select)); + } + + $sql = $type.'('.$this->protect_identifiers(trim($select)).') AS '.$this->escape_identifiers(trim($alias)); + + $this->qb_select[] = $sql; + $this->qb_no_escape[] = NULL; + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_select[] = $sql; + $this->qb_cache_exists[] = 'select'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Determines the alias name based on the table + * + * @param string $item + * @return string + */ + protected function _create_alias_from_table($item) + { + if (strpos($item, '.') !== FALSE) + { + $item = explode('.', $item); + return end($item); + } + + return $item; + } + + // -------------------------------------------------------------------- + + /** + * DISTINCT + * + * Sets a flag which tells the query string compiler to add DISTINCT + * + * @param bool $val + * @return CI_DB_query_builder + */ + public function distinct($val = TRUE) + { + $this->qb_distinct = is_bool($val) ? $val : TRUE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * From + * + * Generates the FROM portion of the query + * + * @param mixed $from can be a string or array + * @return CI_DB_query_builder + */ + public function from($from) + { + foreach ((array) $from as $val) + { + if (strpos($val, ',') !== FALSE) + { + foreach (explode(',', $val) as $v) + { + $v = trim($v); + $this->_track_aliases($v); + + $this->qb_from[] = $v = $this->protect_identifiers($v, TRUE, NULL, FALSE); + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_from[] = $v; + $this->qb_cache_exists[] = 'from'; + } + } + } + else + { + $val = trim($val); + + // Extract any aliases that might exist. We use this information + // in the protect_identifiers to know whether to add a table prefix + $this->_track_aliases($val); + + $this->qb_from[] = $val = $this->protect_identifiers($val, TRUE, NULL, FALSE); + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_from[] = $val; + $this->qb_cache_exists[] = 'from'; + } + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * JOIN + * + * Generates the JOIN portion of the query + * + * @param string + * @param string the join condition + * @param string the type of join + * @param string whether not to try to escape identifiers + * @return CI_DB_query_builder + */ + public function join($table, $cond, $type = '', $escape = NULL) + { + if ($type !== '') + { + $type = strtoupper(trim($type)); + + if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'), TRUE)) + { + $type = ''; + } + else + { + $type .= ' '; + } + } + + // Extract any aliases that might exist. We use this information + // in the protect_identifiers to know whether to add a table prefix + $this->_track_aliases($table); + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + if ( ! $this->_has_operator($cond)) + { + $cond = ' USING ('.($escape ? $this->escape_identifiers($cond) : $cond).')'; + } + elseif ($escape === FALSE) + { + $cond = ' ON '.$cond; + } + else + { + // Split multiple conditions + if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE)) + { + $conditions = array(); + $joints = $joints[0]; + array_unshift($joints, array('', 0)); + + for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--) + { + $joints[$i][1] += strlen($joints[$i][0]); // offset + $conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]); + $pos = $joints[$i][1] - strlen($joints[$i][0]); + $joints[$i] = $joints[$i][0]; + } + } + else + { + $conditions = array($cond); + $joints = array(''); + } + + $cond = ' ON '; + for ($i = 0, $c = count($conditions); $i < $c; $i++) + { + $operator = $this->_get_operator($conditions[$i]); + $cond .= $joints[$i]; + $cond .= preg_match("/(\(*)?([\[\]\w\.'-]+)".preg_quote($operator)."(.*)/i", $conditions[$i], $match) + ? $match[1].$this->protect_identifiers($match[2]).$operator.$this->protect_identifiers($match[3]) + : $conditions[$i]; + } + } + + // Do we want to escape the table name? + if ($escape === TRUE) + { + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // Assemble the JOIN statement + $this->qb_join[] = $join = $type.'JOIN '.$table.$cond; + + if ($this->qb_caching === TRUE) + { + $this->qb_cache_join[] = $join; + $this->qb_cache_exists[] = 'join'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * WHERE + * + * Generates the WHERE portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed + * @param mixed + * @param bool + * @return CI_DB_query_builder + */ + public function where($key, $value = NULL, $escape = NULL) + { + return $this->_wh('qb_where', $key, $value, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR WHERE + * + * Generates the WHERE portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed + * @param mixed + * @param bool + * @return CI_DB_query_builder + */ + public function or_where($key, $value = NULL, $escape = NULL) + { + return $this->_wh('qb_where', $key, $value, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * WHERE, HAVING + * + * @used-by where() + * @used-by or_where() + * @used-by having() + * @used-by or_having() + * + * @param string $qb_key 'qb_where' or 'qb_having' + * @param mixed $key + * @param mixed $value + * @param string $type + * @param bool $escape + * @return CI_DB_query_builder + */ + protected function _wh($qb_key, $key, $value = NULL, $type = 'AND ', $escape = NULL) + { + $qb_cache_key = ($qb_key === 'qb_having') ? 'qb_cache_having' : 'qb_cache_where'; + + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + // If the escape value was not set will base it on the global setting + is_bool($escape) OR $escape = $this->_protect_identifiers; + + foreach ($key as $k => $v) + { + $prefix = (count($this->$qb_key) === 0 && count($this->$qb_cache_key) === 0) + ? $this->_group_get_type('') + : $this->_group_get_type($type); + + if ($v !== NULL) + { + if ($escape === TRUE) + { + $v = $this->escape($v); + } + + if ( ! $this->_has_operator($k)) + { + $k .= ' = '; + } + } + elseif ( ! $this->_has_operator($k)) + { + // value appears not to have been set, assign the test to IS NULL + $k .= ' IS NULL'; + } + elseif (preg_match('/\s*(!?=|<>|\sIS(?:\s+NOT)?\s)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) + { + $k = substr($k, 0, $match[0][1]).($match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL'); + } + + ${$qb_key} = array('condition' => $prefix.$k, 'value' => $v, 'escape' => $escape); + $this->{$qb_key}[] = ${$qb_key}; + if ($this->qb_caching === TRUE) + { + $this->{$qb_cache_key}[] = ${$qb_key}; + $this->qb_cache_exists[] = substr($qb_key, 3); + } + + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * WHERE IN + * + * Generates a WHERE field IN('item', 'item') SQL query, + * joined with 'AND' if appropriate. + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $escape + * @return CI_DB_query_builder + */ + public function where_in($key = NULL, $values = NULL, $escape = NULL) + { + return $this->_where_in($key, $values, FALSE, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR WHERE IN + * + * Generates a WHERE field IN('item', 'item') SQL query, + * joined with 'OR' if appropriate. + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_where_in($key = NULL, $values = NULL, $escape = NULL) + { + return $this->_where_in($key, $values, FALSE, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * WHERE NOT IN + * + * Generates a WHERE field NOT IN('item', 'item') SQL query, + * joined with 'AND' if appropriate. + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $escape + * @return CI_DB_query_builder + */ + public function where_not_in($key = NULL, $values = NULL, $escape = NULL) + { + return $this->_where_in($key, $values, TRUE, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR WHERE NOT IN + * + * Generates a WHERE field NOT IN('item', 'item') SQL query, + * joined with 'OR' if appropriate. + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_where_not_in($key = NULL, $values = NULL, $escape = NULL) + { + return $this->_where_in($key, $values, TRUE, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * Internal WHERE IN + * + * @used-by where_in() + * @used-by or_where_in() + * @used-by where_not_in() + * @used-by or_where_not_in() + * + * @param string $key The field to search + * @param array $values The values searched on + * @param bool $not If the statement would be IN or NOT IN + * @param string $type + * @param bool $escape + * @return CI_DB_query_builder + */ + protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ', $escape = NULL) + { + if ($key === NULL OR $values === NULL) + { + return $this; + } + + if ( ! is_array($values)) + { + $values = array($values); + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + $not = ($not) ? ' NOT' : ''; + + if ($escape === TRUE) + { + $where_in = array(); + foreach ($values as $value) + { + $where_in[] = $this->escape($value); + } + } + else + { + $where_in = array_values($values); + } + + $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) + ? $this->_group_get_type('') + : $this->_group_get_type($type); + + $where_in = array( + 'condition' => $prefix.$key.$not.' IN('.implode(', ', $where_in).')', + 'value' => NULL, + 'escape' => $escape + ); + + $this->qb_where[] = $where_in; + if ($this->qb_caching === TRUE) + { + $this->qb_cache_where[] = $where_in; + $this->qb_cache_exists[] = 'where'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * LIKE + * + * Generates a %LIKE% portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed $field + * @param string $match + * @param string $side + * @param bool $escape + * @return CI_DB_query_builder + */ + public function like($field, $match = '', $side = 'both', $escape = NULL) + { + return $this->_like($field, $match, 'AND ', $side, '', $escape); + } + + // -------------------------------------------------------------------- + + /** + * NOT LIKE + * + * Generates a NOT LIKE portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed $field + * @param string $match + * @param string $side + * @param bool $escape + * @return CI_DB_query_builder + */ + public function not_like($field, $match = '', $side = 'both', $escape = NULL) + { + return $this->_like($field, $match, 'AND ', $side, 'NOT', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR LIKE + * + * Generates a %LIKE% portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed $field + * @param string $match + * @param string $side + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_like($field, $match = '', $side = 'both', $escape = NULL) + { + return $this->_like($field, $match, 'OR ', $side, '', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR NOT LIKE + * + * Generates a NOT LIKE portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed $field + * @param string $match + * @param string $side + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_not_like($field, $match = '', $side = 'both', $escape = NULL) + { + return $this->_like($field, $match, 'OR ', $side, 'NOT', $escape); + } + + // -------------------------------------------------------------------- + + /** + * Internal LIKE + * + * @used-by like() + * @used-by or_like() + * @used-by not_like() + * @used-by or_not_like() + * + * @param mixed $field + * @param string $match + * @param string $type + * @param string $side + * @param string $not + * @param bool $escape + * @return CI_DB_query_builder + */ + protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '', $escape = NULL) + { + if ( ! is_array($field)) + { + $field = array($field => $match); + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + // lowercase $side in case somebody writes e.g. 'BEFORE' instead of 'before' (doh) + $side = strtolower($side); + + foreach ($field as $k => $v) + { + $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) + ? $this->_group_get_type('') : $this->_group_get_type($type); + + if ($escape === TRUE) + { + $v = $this->escape_like_str($v); + } + + switch ($side) + { + case 'none': + $v = "'{$v}'"; + break; + case 'before': + $v = "'%{$v}'"; + break; + case 'after': + $v = "'{$v}%'"; + break; + case 'both': + default: + $v = "'%{$v}%'"; + break; + } + + // some platforms require an escape sequence definition for LIKE wildcards + if ($escape === TRUE && $this->_like_escape_str !== '') + { + $v .= sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + $qb_where = array('condition' => "{$prefix} {$k} {$not} LIKE {$v}", 'value' => NULL, 'escape' => $escape); + $this->qb_where[] = $qb_where; + if ($this->qb_caching === TRUE) + { + $this->qb_cache_where[] = $qb_where; + $this->qb_cache_exists[] = 'where'; + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Starts a query group. + * + * @param string $not (Internal use only) + * @param string $type (Internal use only) + * @return CI_DB_query_builder + */ + public function group_start($not = '', $type = 'AND ') + { + $type = $this->_group_get_type($type); + + $this->qb_where_group_started = TRUE; + $prefix = (count($this->qb_where) === 0 && count($this->qb_cache_where) === 0) ? '' : $type; + $where = array( + 'condition' => $prefix.$not.str_repeat(' ', ++$this->qb_where_group_count).' (', + 'value' => NULL, + 'escape' => FALSE + ); + + $this->qb_where[] = $where; + if ($this->qb_caching) + { + $this->qb_cache_where[] = $where; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Starts a query group, but ORs the group + * + * @return CI_DB_query_builder + */ + public function or_group_start() + { + return $this->group_start('', 'OR '); + } + + // -------------------------------------------------------------------- + + /** + * Starts a query group, but NOTs the group + * + * @return CI_DB_query_builder + */ + public function not_group_start() + { + return $this->group_start('NOT ', 'AND '); + } + + // -------------------------------------------------------------------- + + /** + * Starts a query group, but OR NOTs the group + * + * @return CI_DB_query_builder + */ + public function or_not_group_start() + { + return $this->group_start('NOT ', 'OR '); + } + + // -------------------------------------------------------------------- + + /** + * Ends a query group + * + * @return CI_DB_query_builder + */ + public function group_end() + { + $this->qb_where_group_started = FALSE; + $where = array( + 'condition' => str_repeat(' ', $this->qb_where_group_count--).')', + 'value' => NULL, + 'escape' => FALSE + ); + + $this->qb_where[] = $where; + if ($this->qb_caching) + { + $this->qb_cache_where[] = $where; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Group_get_type + * + * @used-by group_start() + * @used-by _like() + * @used-by _wh() + * @used-by _where_in() + * + * @param string $type + * @return string + */ + protected function _group_get_type($type) + { + if ($this->qb_where_group_started) + { + $type = ''; + $this->qb_where_group_started = FALSE; + } + + return $type; + } + + // -------------------------------------------------------------------- + + /** + * GROUP BY + * + * @param string $by + * @param bool $escape + * @return CI_DB_query_builder + */ + public function group_by($by, $escape = NULL) + { + is_bool($escape) OR $escape = $this->_protect_identifiers; + + if (is_string($by)) + { + $by = ($escape === TRUE) + ? explode(',', $by) + : array($by); + } + + foreach ($by as $val) + { + $val = trim($val); + + if ($val !== '') + { + $val = array('field' => $val, 'escape' => $escape); + + $this->qb_groupby[] = $val; + if ($this->qb_caching === TRUE) + { + $this->qb_cache_groupby[] = $val; + $this->qb_cache_exists[] = 'groupby'; + } + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * HAVING + * + * Separates multiple calls with 'AND'. + * + * @param string $key + * @param string $value + * @param bool $escape + * @return CI_DB_query_builder + */ + public function having($key, $value = NULL, $escape = NULL) + { + return $this->_wh('qb_having', $key, $value, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR HAVING + * + * Separates multiple calls with 'OR'. + * + * @param string $key + * @param string $value + * @param bool $escape + * @return CI_DB_query_builder + */ + public function or_having($key, $value = NULL, $escape = NULL) + { + return $this->_wh('qb_having', $key, $value, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * ORDER BY + * + * @param string $orderby + * @param string $direction ASC, DESC or RANDOM + * @param bool $escape + * @return CI_DB_query_builder + */ + public function order_by($orderby, $direction = '', $escape = NULL) + { + $direction = strtoupper(trim($direction)); + + if ($direction === 'RANDOM') + { + $direction = ''; + + // Do we have a seed value? + $orderby = ctype_digit((string) $orderby) + ? sprintf($this->_random_keyword[1], $orderby) + : $this->_random_keyword[0]; + } + elseif (empty($orderby)) + { + return $this; + } + elseif ($direction !== '') + { + $direction = in_array($direction, array('ASC', 'DESC'), TRUE) ? ' '.$direction : ''; + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + if ($escape === FALSE) + { + $qb_orderby[] = array('field' => $orderby, 'direction' => $direction, 'escape' => FALSE); + } + else + { + $qb_orderby = array(); + foreach (explode(',', $orderby) as $field) + { + $qb_orderby[] = ($direction === '' && preg_match('/\s+(ASC|DESC)$/i', rtrim($field), $match, PREG_OFFSET_CAPTURE)) + ? array('field' => ltrim(substr($field, 0, $match[0][1])), 'direction' => ' '.$match[1][0], 'escape' => TRUE) + : array('field' => trim($field), 'direction' => $direction, 'escape' => TRUE); + } + } + + $this->qb_orderby = array_merge($this->qb_orderby, $qb_orderby); + if ($this->qb_caching === TRUE) + { + $this->qb_cache_orderby = array_merge($this->qb_cache_orderby, $qb_orderby); + $this->qb_cache_exists[] = 'orderby'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * @param int $value LIMIT value + * @param int $offset OFFSET value + * @return CI_DB_query_builder + */ + public function limit($value, $offset = 0) + { + is_null($value) OR $this->qb_limit = (int) $value; + empty($offset) OR $this->qb_offset = (int) $offset; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Sets the OFFSET value + * + * @param int $offset OFFSET value + * @return CI_DB_query_builder + */ + public function offset($offset) + { + empty($offset) OR $this->qb_offset = (int) $offset; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * LIMIT string + * + * Generates a platform-specific LIMIT clause. + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + return $sql.' LIMIT '.($this->qb_offset ? $this->qb_offset.', ' : '').(int) $this->qb_limit; + } + + // -------------------------------------------------------------------- + + /** + * The "set" function. + * + * Allows key/value pairs to be set for inserting or updating + * + * @param mixed + * @param string + * @param bool + * @return CI_DB_query_builder + */ + public function set($key, $value = '', $escape = NULL) + { + $key = $this->_object_to_array($key); + + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + foreach ($key as $k => $v) + { + $this->qb_set[$this->protect_identifiers($k, FALSE, $escape)] = ($escape) + ? $this->escape($v) : $v; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get SELECT query string + * + * Compiles a SELECT query string and returns the sql. + * + * @param string the table name to select from (optional) + * @param bool TRUE: resets QB values; FALSE: leave QB values alone + * @return string + */ + public function get_compiled_select($table = '', $reset = TRUE) + { + if ($table !== '') + { + $this->_track_aliases($table); + $this->from($table); + } + + $select = $this->_compile_select(); + + if ($reset === TRUE) + { + $this->_reset_select(); + } + + return $select; + } + + // -------------------------------------------------------------------- + + /** + * Get + * + * Compiles the select statement based on the other functions called + * and runs the query + * + * @param string the table + * @param string the limit clause + * @param string the offset clause + * @return CI_DB_result + */ + public function get($table = '', $limit = NULL, $offset = NULL) + { + if ($table !== '') + { + $this->_track_aliases($table); + $this->from($table); + } + + if ( ! empty($limit)) + { + $this->limit($limit, $offset); + } + + $result = $this->query($this->_compile_select()); + $this->_reset_select(); + return $result; + } + + // -------------------------------------------------------------------- + + /** + * "Count All Results" query + * + * Generates a platform-specific query string that counts all records + * returned by an Query Builder query. + * + * @param string + * @param bool the reset clause + * @return int + */ + public function count_all_results($table = '', $reset = TRUE) + { + if ($table !== '') + { + $this->_track_aliases($table); + $this->from($table); + } + + // ORDER BY usage is often problematic here (most notably + // on Microsoft SQL Server) and ultimately unnecessary + // for selecting COUNT(*) ... + $qb_orderby = $this->qb_orderby; + $qb_cache_orderby = $this->qb_cache_orderby; + $this->qb_orderby = $this->qb_cache_orderby = array(); + + $result = ($this->qb_distinct === TRUE OR ! empty($this->qb_groupby) OR ! empty($this->qb_cache_groupby) OR $this->qb_limit OR $this->qb_offset) + ? $this->query($this->_count_string.$this->protect_identifiers('numrows')."\nFROM (\n".$this->_compile_select()."\n) CI_count_all_results") + : $this->query($this->_compile_select($this->_count_string.$this->protect_identifiers('numrows'))); + + if ($reset === TRUE) + { + $this->_reset_select(); + } + else + { + $this->qb_orderby = $qb_orderby; + $this->qb_cache_orderby = $qb_cache_orderby; + } + + if ($result->num_rows() === 0) + { + return 0; + } + + $row = $result->row(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * get_where() + * + * Allows the where clause, limit and offset to be added directly + * + * @param string $table + * @param string $where + * @param int $limit + * @param int $offset + * @return CI_DB_result + */ + public function get_where($table = '', $where = NULL, $limit = NULL, $offset = NULL) + { + if ($table !== '') + { + $this->from($table); + } + + if ($where !== NULL) + { + $this->where($where); + } + + if ( ! empty($limit)) + { + $this->limit($limit, $offset); + } + + $result = $this->query($this->_compile_select()); + $this->_reset_select(); + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Insert_Batch + * + * Compiles batch insert strings and runs the queries + * + * @param string $table Table to insert into + * @param array $set An associative array of insert values + * @param bool $escape Whether to escape values and identifiers + * @return int Number of rows inserted or FALSE on failure + */ + public function insert_batch($table, $set = NULL, $escape = NULL, $batch_size = 100) + { + if ($set === NULL) + { + if (empty($this->qb_set)) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + } + else + { + if (empty($set)) + { + return ($this->db_debug) ? $this->display_error('insert_batch() called with no data') : FALSE; + } + + $this->set_insert_batch($set, '', $escape); + } + + if (strlen($table) === 0) + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + + // Batch this baby + $affected_rows = 0; + for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size) + { + if ($this->query($this->_insert_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size)))) + { + $affected_rows += $this->affected_rows(); + } + } + + $this->_reset_write(); + return $affected_rows; + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _insert_batch($table, $keys, $values) + { + return 'INSERT INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values); + } + + // -------------------------------------------------------------------- + + /** + * The "set_insert_batch" function. Allows key/value pairs to be set for batch inserts + * + * @param mixed + * @param string + * @param bool + * @return CI_DB_query_builder + */ + public function set_insert_batch($key, $value = '', $escape = NULL) + { + $key = $this->_object_to_array_batch($key); + + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + $keys = array_keys($this->_object_to_array(reset($key))); + sort($keys); + + foreach ($key as $row) + { + $row = $this->_object_to_array($row); + if (count(array_diff($keys, array_keys($row))) > 0 OR count(array_diff(array_keys($row), $keys)) > 0) + { + // batch function above returns an error on an empty array + $this->qb_set[] = array(); + return; + } + + ksort($row); // puts $row in the same order as our keys + + if ($escape !== FALSE) + { + $clean = array(); + foreach ($row as $value) + { + $clean[] = $this->escape($value); + } + + $row = $clean; + } + + $this->qb_set[] = '('.implode(',', $row).')'; + } + + foreach ($keys as $k) + { + $this->qb_keys[] = $this->protect_identifiers($k, FALSE, $escape); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get INSERT query string + * + * Compiles an insert query and returns the sql + * + * @param string the table to insert into + * @param bool TRUE: reset QB values; FALSE: leave QB values alone + * @return string + */ + public function get_compiled_insert($table = '', $reset = TRUE) + { + if ($this->_validate_insert($table) === FALSE) + { + return FALSE; + } + + $sql = $this->_insert( + $this->protect_identifiers( + $this->qb_from[0], TRUE, NULL, FALSE + ), + array_keys($this->qb_set), + array_values($this->qb_set) + ); + + if ($reset === TRUE) + { + $this->_reset_write(); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Insert + * + * Compiles an insert string and runs the query + * + * @param string the table to insert data into + * @param array an associative array of insert values + * @param bool $escape Whether to escape values and identifiers + * @return bool TRUE on success, FALSE on failure + */ + public function insert($table = '', $set = NULL, $escape = NULL) + { + if ($set !== NULL) + { + $this->set($set, '', $escape); + } + + if ($this->_validate_insert($table) === FALSE) + { + return FALSE; + } + + $sql = $this->_insert( + $this->protect_identifiers( + $this->qb_from[0], TRUE, $escape, FALSE + ), + array_keys($this->qb_set), + array_values($this->qb_set) + ); + + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Validate Insert + * + * This method is used by both insert() and get_compiled_insert() to + * validate that the there data is actually being set and that table + * has been chosen to be inserted into. + * + * @param string the table to insert data into + * @return string + */ + protected function _validate_insert($table = '') + { + if (count($this->qb_set) === 0) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + + if ($table !== '') + { + $this->qb_from[0] = $table; + } + elseif ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Replace + * + * Compiles an replace into string and runs the query + * + * @param string the table to replace data into + * @param array an associative array of insert values + * @return bool TRUE on success, FALSE on failure + */ + public function replace($table = '', $set = NULL) + { + if ($set !== NULL) + { + $this->set($set); + } + + if (count($this->qb_set) === 0) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + + if ($table === '') + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + + $sql = $this->_replace($this->protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->qb_set), array_values($this->qb_set)); + + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + * + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + protected function _replace($table, $keys, $values) + { + return 'REPLACE INTO '.$table.' ('.implode(', ', $keys).') VALUES ('.implode(', ', $values).')'; + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * Note: This is only used (and overridden) by MySQL and CUBRID. + * + * @return string + */ + protected function _from_tables() + { + return implode(', ', $this->qb_from); + } + + // -------------------------------------------------------------------- + + /** + * Get UPDATE query string + * + * Compiles an update query and returns the sql + * + * @param string the table to update + * @param bool TRUE: reset QB values; FALSE: leave QB values alone + * @return string + */ + public function get_compiled_update($table = '', $reset = TRUE) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ($this->_validate_update($table) === FALSE) + { + return FALSE; + } + + $sql = $this->_update($this->qb_from[0], $this->qb_set); + + if ($reset === TRUE) + { + $this->_reset_write(); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * UPDATE + * + * Compiles an update string and runs the query. + * + * @param string $table + * @param array $set An associative array of update values + * @param mixed $where + * @param int $limit + * @return bool TRUE on success, FALSE on failure + */ + public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ($set !== NULL) + { + $this->set($set); + } + + if ($this->_validate_update($table) === FALSE) + { + return FALSE; + } + + if ($where !== NULL) + { + $this->where($where); + } + + if ( ! empty($limit)) + { + $this->limit($limit); + } + + $sql = $this->_update($this->qb_from[0], $this->qb_set); + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Validate Update + * + * This method is used by both update() and get_compiled_update() to + * validate that data is actually being set and that a table has been + * chosen to be update. + * + * @param string the table to update data on + * @return bool + */ + protected function _validate_update($table) + { + if (count($this->qb_set) === 0) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + + if ($table !== '') + { + $this->qb_from = array($this->protect_identifiers($table, TRUE, NULL, FALSE)); + } + elseif ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch + * + * Compiles an update string and runs the query + * + * @param string the table to retrieve the results from + * @param array an associative array of update values + * @param string the where key + * @return int number of rows affected or FALSE on failure + */ + public function update_batch($table, $set = NULL, $index = NULL, $batch_size = 100) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ($index === NULL) + { + return ($this->db_debug) ? $this->display_error('db_must_use_index') : FALSE; + } + + if ($set === NULL) + { + if (empty($this->qb_set_ub)) + { + return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE; + } + } + else + { + if (empty($set)) + { + return ($this->db_debug) ? $this->display_error('update_batch() called with no data') : FALSE; + } + + $this->set_update_batch($set, $index); + } + + if (strlen($table) === 0) + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + + // Batch this baby + $affected_rows = 0; + for ($i = 0, $total = count($this->qb_set_ub); $i < $total; $i += $batch_size) + { + if ($this->query($this->_update_batch($this->protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->qb_set_ub, $i, $batch_size), $index))) + { + $affected_rows += $this->affected_rows(); + } + + $this->qb_where = array(); + } + + $this->_reset_write(); + return $affected_rows; + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string $table Table name + * @param array $values Update data + * @param string $index WHERE key + * @return string + */ + protected function _update_batch($table, $values, $index) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]['value']; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['field'].' = '.$val[$index]['value'].' THEN '.$val[$field]['value']; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k." = CASE \n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END, '; + } + + $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * The "set_update_batch" function. Allows key/value pairs to be set for batch updating + * + * @param array + * @param string + * @param bool + * @return CI_DB_query_builder + */ + public function set_update_batch($key, $index = '', $escape = NULL) + { + $key = $this->_object_to_array_batch($key); + + if ( ! is_array($key)) + { + // @todo error + } + + is_bool($escape) OR $escape = $this->_protect_identifiers; + + foreach ($key as $k => $v) + { + $index_set = FALSE; + $clean = array(); + foreach ($v as $k2 => $v2) + { + if ($k2 === $index) + { + $index_set = TRUE; + } + + $clean[$k2] = array( + 'field' => $this->protect_identifiers($k2, FALSE, $escape), + 'value' => ($escape === FALSE ? $v2 : $this->escape($v2)) + ); + } + + if ($index_set === FALSE) + { + return $this->display_error('db_batch_missing_index'); + } + + $this->qb_set_ub[] = $clean; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Empty Table + * + * Compiles a delete string and runs "DELETE FROM table" + * + * @param string the table to empty + * @return bool TRUE on success, FALSE on failure + */ + public function empty_table($table = '') + { + if ($table === '') + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + else + { + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + $sql = $this->_delete($table); + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Truncate + * + * Compiles a truncate string and runs the query + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @param string the table to truncate + * @return bool TRUE on success, FALSE on failure + */ + public function truncate($table = '') + { + if ($table === '') + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + else + { + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + $sql = $this->_truncate($table); + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the truncate() command, + * then this method maps to 'DELETE FROM table' + * + * @param string the table name + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Get DELETE query string + * + * Compiles a delete query string and returns the sql + * + * @param string the table to delete from + * @param bool TRUE: reset QB values; FALSE: leave QB values alone + * @return string + */ + public function get_compiled_delete($table = '', $reset = TRUE) + { + $this->return_delete_sql = TRUE; + $sql = $this->delete($table, '', NULL, $reset); + $this->return_delete_sql = FALSE; + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Delete + * + * Compiles a delete string and runs the query + * + * @param mixed the table(s) to delete from. String or array + * @param mixed the where clause + * @param mixed the limit clause + * @param bool + * @return mixed + */ + public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ($table === '') + { + if ( ! isset($this->qb_from[0])) + { + return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE; + } + + $table = $this->qb_from[0]; + } + elseif (is_array($table)) + { + empty($where) && $reset_data = FALSE; + + foreach ($table as $single_table) + { + $this->delete($single_table, $where, $limit, $reset_data); + } + + return; + } + else + { + $table = $this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + if ($where !== '') + { + $this->where($where); + } + + if ( ! empty($limit)) + { + $this->limit($limit); + } + + if (count($this->qb_where) === 0) + { + return ($this->db_debug) ? $this->display_error('db_del_must_use_where') : FALSE; + } + + $sql = $this->_delete($table); + if ($reset_data) + { + $this->_reset_write(); + } + + return ($this->return_delete_sql === TRUE) ? $sql : $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string the table name + * @return string + */ + protected function _delete($table) + { + return 'DELETE FROM '.$table.$this->_compile_wh('qb_where') + .($this->qb_limit !== FALSE ? ' LIMIT '.$this->qb_limit : ''); + } + + // -------------------------------------------------------------------- + + /** + * DB Prefix + * + * Prepends a database prefix if one exists in configuration + * + * @param string the table + * @return string + */ + public function dbprefix($table = '') + { + if ($table === '') + { + $this->display_error('db_table_name_required'); + } + + return $this->dbprefix.$table; + } + + // -------------------------------------------------------------------- + + /** + * Set DB Prefix + * + * Set's the DB Prefix to something new without needing to reconnect + * + * @param string the prefix + * @return string + */ + public function set_dbprefix($prefix = '') + { + return $this->dbprefix = $prefix; + } + + // -------------------------------------------------------------------- + + /** + * Track Aliases + * + * Used to track SQL statements written with aliased tables. + * + * @param string The table to inspect + * @return string + */ + protected function _track_aliases($table) + { + if (is_array($table)) + { + foreach ($table as $t) + { + $this->_track_aliases($t); + } + return; + } + + // Does the string contain a comma? If so, we need to separate + // the string into discreet statements + if (strpos($table, ',') !== FALSE) + { + return $this->_track_aliases(explode(',', $table)); + } + + // if a table alias is used we can recognize it by a space + if (strpos($table, ' ') !== FALSE) + { + // if the alias is written with the AS keyword, remove it + $table = preg_replace('/\s+AS\s+/i', ' ', $table); + + // Grab the alias + $table = trim(strrchr($table, ' ')); + + // Store the alias, if it doesn't already exist + if ( ! in_array($table, $this->qb_aliased_tables, TRUE)) + { + $this->qb_aliased_tables[] = $table; + if ($this->qb_caching === TRUE && ! in_array($table, $this->qb_cache_aliased_tables, TRUE)) + { + $this->qb_cache_aliased_tables[] = $table; + $this->qb_cache_exists[] = 'aliased_tables'; + } + } + } + } + + // -------------------------------------------------------------------- + + /** + * Compile the SELECT statement + * + * Generates a query string based on which functions were used. + * Should not be called directly. + * + * @param bool $select_override + * @return string + */ + protected function _compile_select($select_override = FALSE) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + // Write the "select" portion of the query + if ($select_override !== FALSE) + { + $sql = $select_override; + } + else + { + $sql = ( ! $this->qb_distinct) ? 'SELECT ' : 'SELECT DISTINCT '; + + if (count($this->qb_select) === 0) + { + $sql .= '*'; + } + else + { + // Cycle through the "select" portion of the query and prep each column name. + // The reason we protect identifiers here rather than in the select() function + // is because until the user calls the from() function we don't know if there are aliases + foreach ($this->qb_select as $key => $val) + { + $no_escape = isset($this->qb_no_escape[$key]) ? $this->qb_no_escape[$key] : NULL; + $this->qb_select[$key] = $this->protect_identifiers($val, FALSE, $no_escape); + } + + $sql .= implode(', ', $this->qb_select); + } + } + + // Write the "FROM" portion of the query + if (count($this->qb_from) > 0) + { + $sql .= "\nFROM ".$this->_from_tables(); + } + + // Write the "JOIN" portion of the query + if (count($this->qb_join) > 0) + { + $sql .= "\n".implode("\n", $this->qb_join); + } + + $sql .= $this->_compile_wh('qb_where') + .$this->_compile_group_by() + .$this->_compile_wh('qb_having') + .$this->_compile_order_by(); // ORDER BY + + // LIMIT + if ($this->qb_limit !== FALSE OR $this->qb_offset) + { + return $this->_limit($sql."\n"); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Compile WHERE, HAVING statements + * + * Escapes identifiers in WHERE and HAVING statements at execution time. + * + * Required so that aliases are tracked properly, regardless of whether + * where(), or_where(), having(), or_having are called prior to from(), + * join() and dbprefix is added only if needed. + * + * @param string $qb_key 'qb_where' or 'qb_having' + * @return string SQL statement + */ + protected function _compile_wh($qb_key) + { + if (count($this->$qb_key) > 0) + { + for ($i = 0, $c = count($this->$qb_key); $i < $c; $i++) + { + // Is this condition already compiled? + if (is_string($this->{$qb_key}[$i])) + { + continue; + } + elseif ($this->{$qb_key}[$i]['escape'] === FALSE) + { + $this->{$qb_key}[$i] = $this->{$qb_key}[$i]['condition'].(isset($this->{$qb_key}[$i]['value']) ? ' '.$this->{$qb_key}[$i]['value'] : ''); + continue; + } + + // Split multiple conditions + $conditions = preg_split( + '/((?:^|\s+)AND\s+|(?:^|\s+)OR\s+)/i', + $this->{$qb_key}[$i]['condition'], + -1, + PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY + ); + + for ($ci = 0, $cc = count($conditions); $ci < $cc; $ci++) + { + if (($op = $this->_get_operator($conditions[$ci])) === FALSE + OR ! preg_match('/^(\(?)(.*)('.preg_quote($op, '/').')\s*(.*(? '(test <= foo)', /* the whole thing */ + // 1 => '(', /* optional */ + // 2 => 'test', /* the field name */ + // 3 => ' <= ', /* $op */ + // 4 => 'foo', /* optional, if $op is e.g. 'IS NULL' */ + // 5 => ')' /* optional */ + // ); + + if ( ! empty($matches[4])) + { + $this->_is_literal($matches[4]) OR $matches[4] = $this->protect_identifiers(trim($matches[4])); + $matches[4] = ' '.$matches[4]; + } + + $conditions[$ci] = $matches[1].$this->protect_identifiers(trim($matches[2])) + .' '.trim($matches[3]).$matches[4].$matches[5]; + } + + $this->{$qb_key}[$i] = implode('', $conditions).(isset($this->{$qb_key}[$i]['value']) ? ' '.$this->{$qb_key}[$i]['value'] : ''); + } + + return ($qb_key === 'qb_having' ? "\nHAVING " : "\nWHERE ") + .implode("\n", $this->$qb_key); + } + + return ''; + } + + // -------------------------------------------------------------------- + + /** + * Compile GROUP BY + * + * Escapes identifiers in GROUP BY statements at execution time. + * + * Required so that aliases are tracked properly, regardless of whether + * group_by() is called prior to from(), join() and dbprefix is added + * only if needed. + * + * @return string SQL statement + */ + protected function _compile_group_by() + { + if (count($this->qb_groupby) > 0) + { + for ($i = 0, $c = count($this->qb_groupby); $i < $c; $i++) + { + // Is it already compiled? + if (is_string($this->qb_groupby[$i])) + { + continue; + } + + $this->qb_groupby[$i] = ($this->qb_groupby[$i]['escape'] === FALSE OR $this->_is_literal($this->qb_groupby[$i]['field'])) + ? $this->qb_groupby[$i]['field'] + : $this->protect_identifiers($this->qb_groupby[$i]['field']); + } + + return "\nGROUP BY ".implode(', ', $this->qb_groupby); + } + + return ''; + } + + // -------------------------------------------------------------------- + + /** + * Compile ORDER BY + * + * Escapes identifiers in ORDER BY statements at execution time. + * + * Required so that aliases are tracked properly, regardless of whether + * order_by() is called prior to from(), join() and dbprefix is added + * only if needed. + * + * @return string SQL statement + */ + protected function _compile_order_by() + { + if (empty($this->qb_orderby)) + { + return ''; + } + + for ($i = 0, $c = count($this->qb_orderby); $i < $c; $i++) + { + if (is_string($this->qb_orderby[$i])) + { + continue; + } + + if ($this->qb_orderby[$i]['escape'] !== FALSE && ! $this->_is_literal($this->qb_orderby[$i]['field'])) + { + $this->qb_orderby[$i]['field'] = $this->protect_identifiers($this->qb_orderby[$i]['field']); + } + + $this->qb_orderby[$i] = $this->qb_orderby[$i]['field'].$this->qb_orderby[$i]['direction']; + } + + return "\nORDER BY ".implode(', ', $this->qb_orderby); + } + + // -------------------------------------------------------------------- + + /** + * Object to Array + * + * Takes an object as input and converts the class variables to array key/vals + * + * @param object + * @return array + */ + protected function _object_to_array($object) + { + if ( ! is_object($object)) + { + return $object; + } + + $array = array(); + foreach (get_object_vars($object) as $key => $val) + { + // There are some built in keys we need to ignore for this conversion + if ( ! is_object($val) && ! is_array($val) && $key !== '_parent_name') + { + $array[$key] = $val; + } + } + + return $array; + } + + // -------------------------------------------------------------------- + + /** + * Object to Array + * + * Takes an object as input and converts the class variables to array key/vals + * + * @param object + * @return array + */ + protected function _object_to_array_batch($object) + { + if ( ! is_object($object)) + { + return $object; + } + + $array = array(); + $out = get_object_vars($object); + $fields = array_keys($out); + + foreach ($fields as $val) + { + // There are some built in keys we need to ignore for this conversion + if ($val !== '_parent_name') + { + $i = 0; + foreach ($out[$val] as $data) + { + $array[$i++][$val] = $data; + } + } + } + + return $array; + } + + // -------------------------------------------------------------------- + + /** + * Start Cache + * + * Starts QB caching + * + * @return CI_DB_query_builder + */ + public function start_cache() + { + $this->qb_caching = TRUE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Stop Cache + * + * Stops QB caching + * + * @return CI_DB_query_builder + */ + public function stop_cache() + { + $this->qb_caching = FALSE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Flush Cache + * + * Empties the QB cache + * + * @return CI_DB_query_builder + */ + public function flush_cache() + { + $this->_reset_run(array( + 'qb_cache_select' => array(), + 'qb_cache_from' => array(), + 'qb_cache_join' => array(), + 'qb_cache_where' => array(), + 'qb_cache_groupby' => array(), + 'qb_cache_having' => array(), + 'qb_cache_orderby' => array(), + 'qb_cache_set' => array(), + 'qb_cache_exists' => array(), + 'qb_cache_no_escape' => array(), + 'qb_cache_aliased_tables' => array() + )); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Merge Cache + * + * When called, this function merges any cached QB arrays with + * locally called ones. + * + * @return void + */ + protected function _merge_cache() + { + if (count($this->qb_cache_exists) === 0) + { + return; + } + elseif (in_array('select', $this->qb_cache_exists, TRUE)) + { + $qb_no_escape = $this->qb_cache_no_escape; + } + + foreach (array_unique($this->qb_cache_exists) as $val) // select, from, etc. + { + $qb_variable = 'qb_'.$val; + $qb_cache_var = 'qb_cache_'.$val; + $qb_new = $this->$qb_cache_var; + + for ($i = 0, $c = count($this->$qb_variable); $i < $c; $i++) + { + if ( ! in_array($this->{$qb_variable}[$i], $qb_new, TRUE)) + { + $qb_new[] = $this->{$qb_variable}[$i]; + if ($val === 'select') + { + $qb_no_escape[] = $this->qb_no_escape[$i]; + } + } + } + + $this->$qb_variable = $qb_new; + if ($val === 'select') + { + $this->qb_no_escape = $qb_no_escape; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Is literal + * + * Determines if a string represents a literal value or a field name + * + * @param string $str + * @return bool + */ + protected function _is_literal($str) + { + $str = trim($str); + + if (empty($str) OR ctype_digit($str) OR (string) (float) $str === $str OR in_array(strtoupper($str), array('TRUE', 'FALSE'), TRUE)) + { + return TRUE; + } + + static $_str; + + if (empty($_str)) + { + $_str = ($this->_escape_char !== '"') + ? array('"', "'") : array("'"); + } + + return in_array($str[0], $_str, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Reset Query Builder values. + * + * Publicly-visible method to reset the QB values. + * + * @return CI_DB_query_builder + */ + public function reset_query() + { + $this->_reset_select(); + $this->_reset_write(); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Resets the query builder values. Called by the get() function + * + * @param array An array of fields to reset + * @return void + */ + protected function _reset_run($qb_reset_items) + { + foreach ($qb_reset_items as $item => $default_value) + { + $this->$item = $default_value; + } + } + + // -------------------------------------------------------------------- + + /** + * Resets the query builder values. Called by the get() function + * + * @return void + */ + protected function _reset_select() + { + $this->_reset_run(array( + 'qb_select' => array(), + 'qb_from' => array(), + 'qb_join' => array(), + 'qb_where' => array(), + 'qb_groupby' => array(), + 'qb_having' => array(), + 'qb_orderby' => array(), + 'qb_aliased_tables' => array(), + 'qb_no_escape' => array(), + 'qb_distinct' => FALSE, + 'qb_limit' => FALSE, + 'qb_offset' => FALSE + )); + } + + // -------------------------------------------------------------------- + + /** + * Resets the query builder "write" values. + * + * Called by the insert() update() insert_batch() update_batch() and delete() functions + * + * @return void + */ + protected function _reset_write() + { + $this->_reset_run(array( + 'qb_set' => array(), + 'qb_set_ub' => array(), + 'qb_from' => array(), + 'qb_join' => array(), + 'qb_where' => array(), + 'qb_orderby' => array(), + 'qb_keys' => array(), + 'qb_limit' => FALSE + )); + } + +} diff --git a/system/database/DB_result.php b/system/database/DB_result.php new file mode 100644 index 0000000..a5a4ca2 --- /dev/null +++ b/system/database/DB_result.php @@ -0,0 +1,665 @@ +conn_id = $driver_object->conn_id; + $this->result_id = $driver_object->result_id; + } + + // -------------------------------------------------------------------- + + /** + * Number of rows in the result set + * + * @return int + */ + public function num_rows() + { + if (is_int($this->num_rows)) + { + return $this->num_rows; + } + elseif (count($this->result_array) > 0) + { + return $this->num_rows = count($this->result_array); + } + elseif (count($this->result_object) > 0) + { + return $this->num_rows = count($this->result_object); + } + + return $this->num_rows = count($this->result_array()); + } + + // -------------------------------------------------------------------- + + /** + * Query result. Acts as a wrapper function for the following functions. + * + * @param string $type 'object', 'array' or a custom class name + * @return array + */ + public function result($type = 'object') + { + if ($type === 'array') + { + return $this->result_array(); + } + elseif ($type === 'object') + { + return $this->result_object(); + } + + return $this->custom_result_object($type); + } + + // -------------------------------------------------------------------- + + /** + * Custom query result. + * + * @param string $class_name + * @return array + */ + public function custom_result_object($class_name) + { + if (isset($this->custom_result_object[$class_name])) + { + return $this->custom_result_object[$class_name]; + } + elseif ( ! $this->result_id OR $this->num_rows === 0) + { + return array(); + } + + // Don't fetch the result set again if we already have it + $_data = NULL; + if (($c = count($this->result_array)) > 0) + { + $_data = 'result_array'; + } + elseif (($c = count($this->result_object)) > 0) + { + $_data = 'result_object'; + } + + if ($_data !== NULL) + { + for ($i = 0; $i < $c; $i++) + { + $this->custom_result_object[$class_name][$i] = new $class_name(); + + foreach ($this->{$_data}[$i] as $key => $value) + { + $this->custom_result_object[$class_name][$i]->$key = $value; + } + } + + return $this->custom_result_object[$class_name]; + } + + is_null($this->row_data) OR $this->data_seek(0); + $this->custom_result_object[$class_name] = array(); + + while ($row = $this->_fetch_object($class_name)) + { + $this->custom_result_object[$class_name][] = $row; + } + + return $this->custom_result_object[$class_name]; + } + + // -------------------------------------------------------------------- + + /** + * Query result. "object" version. + * + * @return array + */ + public function result_object() + { + if (count($this->result_object) > 0) + { + return $this->result_object; + } + + // In the event that query caching is on, the result_id variable + // will not be a valid resource so we'll simply return an empty + // array. + if ( ! $this->result_id OR $this->num_rows === 0) + { + return array(); + } + + if (($c = count($this->result_array)) > 0) + { + for ($i = 0; $i < $c; $i++) + { + $this->result_object[$i] = (object) $this->result_array[$i]; + } + + return $this->result_object; + } + + is_null($this->row_data) OR $this->data_seek(0); + while ($row = $this->_fetch_object()) + { + $this->result_object[] = $row; + } + + return $this->result_object; + } + + // -------------------------------------------------------------------- + + /** + * Query result. "array" version. + * + * @return array + */ + public function result_array() + { + if (count($this->result_array) > 0) + { + return $this->result_array; + } + + // In the event that query caching is on, the result_id variable + // will not be a valid resource so we'll simply return an empty + // array. + if ( ! $this->result_id OR $this->num_rows === 0) + { + return array(); + } + + if (($c = count($this->result_object)) > 0) + { + for ($i = 0; $i < $c; $i++) + { + $this->result_array[$i] = (array) $this->result_object[$i]; + } + + return $this->result_array; + } + + is_null($this->row_data) OR $this->data_seek(0); + while ($row = $this->_fetch_assoc()) + { + $this->result_array[] = $row; + } + + return $this->result_array; + } + + // -------------------------------------------------------------------- + + /** + * Row + * + * A wrapper method. + * + * @param mixed $n + * @param string $type 'object' or 'array' + * @return mixed + */ + public function row($n = 0, $type = 'object') + { + if ( ! is_numeric($n)) + { + // We cache the row data for subsequent uses + is_array($this->row_data) OR $this->row_data = $this->row_array(0); + + // array_key_exists() instead of isset() to allow for NULL values + if (empty($this->row_data) OR ! array_key_exists($n, $this->row_data)) + { + return NULL; + } + + return $this->row_data[$n]; + } + + if ($type === 'object') return $this->row_object($n); + elseif ($type === 'array') return $this->row_array($n); + + return $this->custom_row_object($n, $type); + } + + // -------------------------------------------------------------------- + + /** + * Assigns an item into a particular column slot + * + * @param mixed $key + * @param mixed $value + * @return void + */ + public function set_row($key, $value = NULL) + { + // We cache the row data for subsequent uses + if ( ! is_array($this->row_data)) + { + $this->row_data = $this->row_array(0); + } + + if (is_array($key)) + { + foreach ($key as $k => $v) + { + $this->row_data[$k] = $v; + } + return; + } + + if ($key !== '' && $value !== NULL) + { + $this->row_data[$key] = $value; + } + } + + // -------------------------------------------------------------------- + + /** + * Returns a single result row - custom object version + * + * @param int $n + * @param string $type + * @return object + */ + public function custom_row_object($n, $type) + { + isset($this->custom_result_object[$type]) OR $this->custom_result_object($type); + + if (count($this->custom_result_object[$type]) === 0) + { + return NULL; + } + + if ($n !== $this->current_row && isset($this->custom_result_object[$type][$n])) + { + $this->current_row = $n; + } + + return $this->custom_result_object[$type][$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns a single result row - object version + * + * @param int $n + * @return object + */ + public function row_object($n = 0) + { + $result = $this->result_object(); + if (count($result) === 0) + { + return NULL; + } + + if ($n !== $this->current_row && isset($result[$n])) + { + $this->current_row = $n; + } + + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns a single result row - array version + * + * @param int $n + * @return array + */ + public function row_array($n = 0) + { + $result = $this->result_array(); + if (count($result) === 0) + { + return NULL; + } + + if ($n !== $this->current_row && isset($result[$n])) + { + $this->current_row = $n; + } + + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "first" row + * + * @param string $type + * @return mixed + */ + public function first_row($type = 'object') + { + $result = $this->result($type); + return (count($result) === 0) ? NULL : $result[0]; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "last" row + * + * @param string $type + * @return mixed + */ + public function last_row($type = 'object') + { + $result = $this->result($type); + return (count($result) === 0) ? NULL : $result[count($result) - 1]; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "next" row + * + * @param string $type + * @return mixed + */ + public function next_row($type = 'object') + { + $result = $this->result($type); + if (count($result) === 0) + { + return NULL; + } + + return isset($result[$this->current_row + 1]) + ? $result[++$this->current_row] + : NULL; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "previous" row + * + * @param string $type + * @return mixed + */ + public function previous_row($type = 'object') + { + $result = $this->result($type); + if (count($result) === 0) + { + return NULL; + } + + if (isset($result[$this->current_row - 1])) + { + --$this->current_row; + } + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns an unbuffered row and move pointer to next row + * + * @param string $type 'array', 'object' or a custom class name + * @return mixed + */ + public function unbuffered_row($type = 'object') + { + if ($type === 'array') + { + return $this->_fetch_assoc(); + } + elseif ($type === 'object') + { + return $this->_fetch_object(); + } + + return $this->_fetch_object($type); + } + + // -------------------------------------------------------------------- + + /** + * The following methods are normally overloaded by the identically named + * methods in the platform-specific driver -- except when query caching + * is used. When caching is enabled we do not load the other driver. + * These functions are primarily here to prevent undefined function errors + * when a cached result object is in use. They are not otherwise fully + * operational due to the unavailability of the database resource IDs with + * cached results. + */ + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * Overridden by driver result classes. + * + * @return int + */ + public function num_fields() + { + return 0; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names. + * + * Overridden by driver result classes. + * + * @return array + */ + public function list_fields() + { + return array(); + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data. + * + * Overridden by driver result classes. + * + * @return array + */ + public function field_data() + { + return array(); + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * Overridden by driver result classes. + * + * @return void + */ + public function free_result() + { + $this->result_id = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * Overridden by driver result classes. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array. + * + * Overridden by driver result classes. + * + * @return array + */ + protected function _fetch_assoc() + { + return array(); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object. + * + * Overridden by driver result classes. + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return new $class_name(); + } + +} diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php new file mode 100644 index 0000000..8680176 --- /dev/null +++ b/system/database/DB_utility.php @@ -0,0 +1,424 @@ +db =& $db; + log_message('info', 'Database Utility Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * List databases + * + * @return array + */ + public function list_databases() + { + // Is there a cached result? + if (isset($this->db->data_cache['db_names'])) + { + return $this->db->data_cache['db_names']; + } + elseif ($this->_list_databases === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $this->db->data_cache['db_names'] = array(); + + $query = $this->db->query($this->_list_databases); + if ($query === FALSE) + { + return $this->db->data_cache['db_names']; + } + + for ($i = 0, $query = $query->result_array(), $c = count($query); $i < $c; $i++) + { + $this->db->data_cache['db_names'][] = current($query[$i]); + } + + return $this->db->data_cache['db_names']; + } + + // -------------------------------------------------------------------- + + /** + * Determine if a particular database exists + * + * @param string $database_name + * @return bool + */ + public function database_exists($database_name) + { + return in_array($database_name, $this->list_databases()); + } + + // -------------------------------------------------------------------- + + /** + * Optimize Table + * + * @param string $table_name + * @return mixed + */ + public function optimize_table($table_name) + { + if ($this->_optimize_table === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $query = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); + if ($query !== FALSE) + { + $query = $query->result_array(); + return current($query); + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Optimize Database + * + * @return mixed + */ + public function optimize_database() + { + if ($this->_optimize_table === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $result = array(); + foreach ($this->db->list_tables() as $table_name) + { + $res = $this->db->query(sprintf($this->_optimize_table, $this->db->escape_identifiers($table_name))); + if (is_bool($res)) + { + return $res; + } + + // Build the result array... + $res = $res->result_array(); + $res = current($res); + $key = str_replace($this->db->database.'.', '', current($res)); + $keys = array_keys($res); + unset($res[$keys[0]]); + + $result[$key] = $res; + } + + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Repair Table + * + * @param string $table_name + * @return mixed + */ + public function repair_table($table_name) + { + if ($this->_repair_table === FALSE) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unsupported_feature') : FALSE; + } + + $query = $this->db->query(sprintf($this->_repair_table, $this->db->escape_identifiers($table_name))); + if (is_bool($query)) + { + return $query; + } + + $query = $query->result_array(); + return current($query); + } + + // -------------------------------------------------------------------- + + /** + * Generate CSV from a query result object + * + * @param object $query Query result object + * @param string $delim Delimiter (default: ,) + * @param string $newline Newline character (default: \n) + * @param string $enclosure Enclosure (default: ") + * @return string + */ + public function csv_from_result($query, $delim = ',', $newline = "\n", $enclosure = '"') + { + if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) + { + show_error('You must submit a valid result object'); + } + + $out = ''; + // First generate the headings from the table column names + foreach ($query->list_fields() as $name) + { + $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; + } + + $out = substr($out, 0, -strlen($delim)).$newline; + + // Next blast through the result array and build out the rows + while ($row = $query->unbuffered_row('array')) + { + $line = array(); + foreach ($row as $item) + { + $line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure; + } + $out .= implode($delim, $line).$newline; + } + + return $out; + } + + // -------------------------------------------------------------------- + + /** + * Generate XML data from a query result object + * + * @param object $query Query result object + * @param array $params Any preferences + * @return string + */ + public function xml_from_result($query, $params = array()) + { + if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) + { + show_error('You must submit a valid result object'); + } + + // Set our default values + foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val) + { + if ( ! isset($params[$key])) + { + $params[$key] = $val; + } + } + + // Create variables for convenience + extract($params); + + // Load the xml helper + get_instance()->load->helper('xml'); + + // Generate the result + $xml = '<'.$root.'>'.$newline; + while ($row = $query->unbuffered_row()) + { + $xml .= $tab.'<'.$element.'>'.$newline; + foreach ($row as $key => $val) + { + $xml .= $tab.$tab.'<'.$key.'>'.xml_convert($val).''.$newline; + } + $xml .= $tab.''.$newline; + } + + return $xml.''.$newline; + } + + // -------------------------------------------------------------------- + + /** + * Database Backup + * + * @param array $params + * @return string + */ + public function backup($params = array()) + { + // If the parameters have not been submitted as an + // array then we know that it is simply the table + // name, which is a valid short cut. + if (is_string($params)) + { + $params = array('tables' => $params); + } + + // Set up our default preferences + $prefs = array( + 'tables' => array(), + 'ignore' => array(), + 'filename' => '', + 'format' => 'gzip', // gzip, zip, txt + 'add_drop' => TRUE, + 'add_insert' => TRUE, + 'newline' => "\n", + 'foreign_key_checks' => TRUE + ); + + // Did the user submit any preferences? If so set them.... + if (count($params) > 0) + { + foreach ($prefs as $key => $val) + { + if (isset($params[$key])) + { + $prefs[$key] = $params[$key]; + } + } + } + + // Are we backing up a complete database or individual tables? + // If no table names were submitted we'll fetch the entire table list + if (count($prefs['tables']) === 0) + { + $prefs['tables'] = $this->db->list_tables(); + } + + // Validate the format + if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE)) + { + $prefs['format'] = 'txt'; + } + + // Is the encoder supported? If not, we'll either issue an + // error or use plain text depending on the debug settings + if (($prefs['format'] === 'gzip' && ! function_exists('gzencode')) + OR ($prefs['format'] === 'zip' && ! function_exists('gzcompress'))) + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsupported_compression'); + } + + $prefs['format'] = 'txt'; + } + + // Was a Zip file requested? + if ($prefs['format'] === 'zip') + { + // Set the filename if not provided (only needed with Zip files) + if ($prefs['filename'] === '') + { + $prefs['filename'] = (count($prefs['tables']) === 1 ? $prefs['tables'] : $this->db->database) + .date('Y-m-d_H-i', time()).'.sql'; + } + else + { + // If they included the .zip file extension we'll remove it + if (preg_match('|.+?\.zip$|', $prefs['filename'])) + { + $prefs['filename'] = str_replace('.zip', '', $prefs['filename']); + } + + // Tack on the ".sql" file extension if needed + if ( ! preg_match('|.+?\.sql$|', $prefs['filename'])) + { + $prefs['filename'] .= '.sql'; + } + } + + // Load the Zip class and output it + $CI =& get_instance(); + $CI->load->library('zip'); + $CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); + return $CI->zip->get_zip(); + } + elseif ($prefs['format'] === 'txt') // Was a text file requested? + { + return $this->_backup($prefs); + } + elseif ($prefs['format'] === 'gzip') // Was a Gzip file requested? + { + return gzencode($this->_backup($prefs)); + } + + return; + } + +} diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php new file mode 100644 index 0000000..9d6afea --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -0,0 +1,405 @@ +dsn, $matches)) + { + if (stripos($matches[2], 'autocommit=off') !== FALSE) + { + $this->auto_commit = FALSE; + } + } + else + { + // If no port is defined by the user, use the default value + empty($this->port) OR $this->port = 33000; + } + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:([^:]*):([^:]*):(\?.+)?$/', $this->dsn, $matches)) + { + $func = ($persistent !== TRUE) ? 'cubrid_connect_with_url' : 'cubrid_pconnect_with_url'; + return ($matches[2] === '' && $matches[3] === '' && $this->username !== '' && $this->password !== '') + ? $func($this->dsn, $this->username, $this->password) + : $func($this->dsn); + } + + $func = ($persistent !== TRUE) ? 'cubrid_connect' : 'cubrid_pconnect'; + return ($this->username !== '') + ? $func($this->hostname, $this->port, $this->database, $this->username, $this->password) + : $func($this->hostname, $this->port, $this->database); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @return void + */ + public function reconnect() + { + if (cubrid_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + return ( ! $this->conn_id OR ($version = cubrid_get_server_info($this->conn_id)) === FALSE) + ? FALSE + : $this->data_cache['version'] = $version; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return cubrid_query($sql, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + if (($autocommit = cubrid_get_autocommit($this->conn_id)) === NULL) + { + return FALSE; + } + elseif ($autocommit === TRUE) + { + return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if ( ! cubrid_commit($this->conn_id)) + { + return FALSE; + } + + if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) + { + return cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if ( ! cubrid_rollback($this->conn_id)) + { + return FALSE; + } + + if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) + { + cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependent string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return cubrid_real_escape_string($str, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return cubrid_affected_rows(); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return cubrid_insert_id($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES'; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + return array('code' => cubrid_errno($this->conn_id), 'message' => cubrid_error($this->conn_id)); + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + cubrid_close($this->conn_id); + } + +} diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php new file mode 100644 index 0000000..95e7ca1 --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -0,0 +1,230 @@ + 'INTEGER', + 'SMALLINT' => 'INTEGER', + 'INT' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'BIGINT' => 'NUMERIC', + 'FLOAT' => 'DOUBLE', + 'REAL' => 'DOUBLE' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; + } + else + { + $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; + $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'LONGTEXT': + $attributes['TYPE'] = 'STRING'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php new file mode 100644 index 0000000..a71b1a2 --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_result.php @@ -0,0 +1,177 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = cubrid_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return cubrid_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + return cubrid_column_names($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = cubrid_field_name($this->result_id, $i); + $retval[$i]->type = cubrid_field_type($this->result_id, $i); + $retval[$i]->max_length = cubrid_field_len($this->result_id, $i); + $retval[$i]->primary_key = (int) (strpos(cubrid_field_flags($this->result_id, $i), 'primary_key') !== FALSE); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id) OR + (get_resource_type($this->result_id) === 'Unknown' && preg_match('/Resource id #/', strval($this->result_id)))) + { + cubrid_close_request($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return cubrid_data_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return cubrid_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return cubrid_fetch_object($this->result_id, $class_name); + } + +} diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php new file mode 100644 index 0000000..eb906ae --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_utility.php @@ -0,0 +1,79 @@ +db->data_cache['db_names'])) + { + return $this->db->data_cache['db_names']; + } + + return $this->db->data_cache['db_names'] = cubrid_list_dbs($this->db->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * CUBRID Export + * + * @param array Preferences + * @return mixed + */ + protected function _backup($params = array()) + { + // No SQL based support in CUBRID as of version 8.4.0. Database or + // table backup can be performed using CUBRID Manager + // database administration tool. + return $this->db->display_error('db_unsupported_feature'); + } +} diff --git a/system/database/drivers/cubrid/index.html b/system/database/drivers/cubrid/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/cubrid/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/ibase/ibase_driver.php b/system/database/drivers/ibase/ibase_driver.php new file mode 100644 index 0000000..fd866ff --- /dev/null +++ b/system/database/drivers/ibase/ibase_driver.php @@ -0,0 +1,413 @@ +hostname.':'.$this->database, $this->username, $this->password, $this->char_set) + : ibase_connect($this->hostname.':'.$this->database, $this->username, $this->password, $this->char_set); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if (($service = ibase_service_attach($this->hostname, $this->username, $this->password))) + { + $this->data_cache['version'] = ibase_server_info($service, IBASE_SVC_SERVER_VERSION); + + // Don't keep the service open + ibase_service_detach($service); + return $this->data_cache['version']; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return ibase_query(isset($this->_ibase_trans) ? $this->_ibase_trans : $this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + if (($trans_handle = ibase_trans($this->conn_id)) === FALSE) + { + return FALSE; + } + + $this->_ibase_trans = $trans_handle; + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if (ibase_commit($this->_ibase_trans)) + { + $this->_ibase_trans = NULL; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if (ibase_rollback($this->_ibase_trans)) + { + $this->_ibase_trans = NULL; + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return ibase_affected_rows($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @param string $generator_name + * @param int $inc_by + * @return int + */ + public function insert_id($generator_name, $inc_by = 0) + { + //If a generator hasn't been used before it will return 0 + return ibase_gen_id('"'.$generator_name.'"', $inc_by); + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT TRIM("RDB$RELATION_NAME") AS TABLE_NAME FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql.' AND TRIM("RDB$RELATION_NAME") AS TABLE_NAME LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT TRIM("RDB$FIELD_NAME") AS COLUMN_NAME FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", + CASE "fields"."RDB$FIELD_TYPE" + WHEN 7 THEN \'SMALLINT\' + WHEN 8 THEN \'INTEGER\' + WHEN 9 THEN \'QUAD\' + WHEN 10 THEN \'FLOAT\' + WHEN 11 THEN \'DFLOAT\' + WHEN 12 THEN \'DATE\' + WHEN 13 THEN \'TIME\' + WHEN 14 THEN \'CHAR\' + WHEN 16 THEN \'INT64\' + WHEN 27 THEN \'DOUBLE\' + WHEN 35 THEN \'TIMESTAMP\' + WHEN 37 THEN \'VARCHAR\' + WHEN 40 THEN \'CSTRING\' + WHEN 261 THEN \'BLOB\' + ELSE NULL + END AS "type", + "fields"."RDB$FIELD_LENGTH" AS "max_length", + "rfields"."RDB$DEFAULT_VALUE" AS "default" + FROM "RDB$RELATION_FIELDS" "rfields" + JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" + WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' + ORDER BY "rfields"."RDB$FIELD_POSITION"'; + + return (($query = $this->query($sql)) !== FALSE) + ? $query->result_object() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + return array('code' => ibase_errcode(), 'message' => ibase_errmsg()); + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + // Limit clause depends on if Interbase or Firebird + if (stripos($this->version(), 'firebird') !== FALSE) + { + $select = 'FIRST '.$this->qb_limit + .($this->qb_offset ? ' SKIP '.$this->qb_offset : ''); + } + else + { + $select = 'ROWS ' + .($this->qb_offset ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); + } + + return preg_replace('`SELECT`i', 'SELECT '.$select, $sql, 1); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + ibase_close($this->conn_id); + } + +} diff --git a/system/database/drivers/ibase/ibase_forge.php b/system/database/drivers/ibase/ibase_forge.php new file mode 100644 index 0000000..77aa4ae --- /dev/null +++ b/system/database/drivers/ibase/ibase_forge.php @@ -0,0 +1,251 @@ + 'INTEGER', + 'INTEGER' => 'INT64', + 'FLOAT' => 'DOUBLE PRECISION' + ); + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_null = 'NULL'; + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name + * @return bool + */ + public function create_database($db_name) + { + // Firebird databases are flat files, so a path is required + + // Hostname is needed for remote access + empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; + + return parent::create_database('"'.$db_name.'"'); + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name (ignored) + * @return bool + */ + public function drop_database($db_name) + { + if ( ! ibase_drop_db($this->conn_id)) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + return FALSE; + } + + if (isset($field[$i]['type'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identififers($field[$i]['name']) + .' TYPE '.$field[$i]['type'].$field[$i]['length']; + } + + if ( ! empty($field[$i]['default'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' SET DEFAULT '.$field[$i]['default']; + } + + if (isset($field[$i]['null'])) + { + $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' + .($field[$i]['null'] === TRUE ? 'NULL' : '1') + .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) + .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); + } + + if ( ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'].$field['length'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INT': + $attributes['TYPE'] = 'INTEGER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'INT64'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported + } + +} diff --git a/system/database/drivers/ibase/ibase_result.php b/system/database/drivers/ibase/ibase_result.php new file mode 100644 index 0000000..b548f32 --- /dev/null +++ b/system/database/drivers/ibase/ibase_result.php @@ -0,0 +1,161 @@ +result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $num_fields = $this->num_fields(); $i < $num_fields; $i++) + { + $info = ibase_field_info($this->result_id, $i); + $field_names[] = $info['name']; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $info = ibase_field_info($this->result_id, $i); + + $retval[$i] = new stdClass(); + $retval[$i]->name = $info['name']; + $retval[$i]->type = $info['type']; + $retval[$i]->max_length = $info['length']; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + ibase_free_result($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return ibase_fetch_assoc($this->result_id, IBASE_FETCH_BLOBS); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + $row = ibase_fetch_object($this->result_id, IBASE_FETCH_BLOBS); + + if ($class_name === 'stdClass' OR ! $row) + { + return $row; + } + + $class_name = new $class_name(); + foreach ($row as $key => $value) + { + $class_name->$key = $value; + } + + return $class_name; + } + +} diff --git a/system/database/drivers/ibase/ibase_utility.php b/system/database/drivers/ibase/ibase_utility.php new file mode 100644 index 0000000..a1e5d69 --- /dev/null +++ b/system/database/drivers/ibase/ibase_utility.php @@ -0,0 +1,69 @@ +db->hostname, $this->db->username, $this->db->password)) + { + $res = ibase_backup($service, $this->db->database, $filename.'.fbk'); + + // Close the service connection + ibase_service_detach($service); + return $res; + } + + return FALSE; + } + +} diff --git a/system/database/drivers/ibase/index.html b/system/database/drivers/ibase/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/ibase/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/index.html b/system/database/drivers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/mssql/index.html b/system/database/drivers/mssql/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/mssql/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php new file mode 100644 index 0000000..b2b17d0 --- /dev/null +++ b/system/database/drivers/mssql/mssql_driver.php @@ -0,0 +1,518 @@ +port)) + { + $this->hostname .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; + } + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + $this->conn_id = ($persistent) + ? mssql_pconnect($this->hostname, $this->username, $this->password) + : mssql_connect($this->hostname, $this->username, $this->password); + + if ( ! $this->conn_id) + { + return FALSE; + } + + // ---------------------------------------------------------------- + + // Select the DB... assuming a database name is specified in the config file + if ($this->database !== '' && ! $this->db_select()) + { + log_message('error', 'Unable to select database: '.$this->database); + + return ($this->db_debug === TRUE) + ? $this->display_error('db_unable_to_select', $this->database) + : FALSE; + } + + // Determine how identifiers are escaped + $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); + $query = $query->row_array(); + $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; + $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + // Note: Escaping is required in the event that the DB name + // contains reserved characters. + if (mssql_select_db('['.$database.']', $this->conn_id)) + { + $this->database = $database; + $this->data_cache = array(); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return mixed resource if rows are returned, bool otherwise + */ + protected function _execute($sql) + { + return mssql_query($sql, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return $this->simple_query('BEGIN TRAN'); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return $this->simple_query('COMMIT TRAN'); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return $this->simple_query('ROLLBACK TRAN'); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return mssql_rows_affected($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * Returns the last id created in the Identity column. + * + * @return string + */ + public function insert_id() + { + $query = version_compare($this->version(), '8', '>=') + ? 'SELECT SCOPE_IDENTITY() AS last_id' + : 'SELECT @@IDENTITY AS last_id'; + + $query = $this->query($query); + $query = $query->row(); + return $query->last_id; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string $charset + * @return bool + */ + protected function _db_set_charset($charset) + { + return (ini_set('mssql.charset', $charset) !== FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @return string + */ + protected function _version() + { + return "SELECT SERVERPROPERTY('ProductVersion') AS ver"; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('name') + .' FROM '.$this->escape_identifiers('sysobjects') + .' WHERE '.$this->escape_identifiers('type')." = 'U'"; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql.' ORDER BY '.$this->escape_identifiers('name'); + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + // We need this because the error info is discarded by the + // server the first time you request it, and query() already + // calls error() once for logging purposes when a query fails. + static $error = array('code' => 0, 'message' => NULL); + + $message = mssql_get_last_message(); + if ( ! empty($message)) + { + $error['code'] = $this->query('SELECT @@ERROR AS code')->row()->code; + $error['message'] = $message; + } + + return $error; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + $limit = $this->qb_offset + $this->qb_limit; + + // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, + // however an ORDER BY clause is required for it to work + if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) + { + $orderby = $this->_compile_order_by(); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); + + // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results + if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) + { + $select = '*'; // Inevitable + } + else + { + // Use only field names and their aliases, everything else is out of our scope. + $select = array(); + $field_regexp = ($this->_quoted_identifier) + ? '("[^\"]+")' : '(\[[^\]]+\])'; + for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) + { + $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) + ? $m[1] : $this->qb_select[$i]; + } + $select = implode(', ', $select); + } + + return 'SELECT '.$select." FROM (\n\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + // Multiple-value inserts are only supported as of SQL Server 2008 + if (version_compare($this->version(), '10', '>=')) + { + return parent::_insert_batch($table, $keys, $values); + } + + return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + mssql_close($this->conn_id); + } + +} diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php new file mode 100644 index 0000000..9a3e3eb --- /dev/null +++ b/system/database/drivers/mssql/mssql_forge.php @@ -0,0 +1,151 @@ + 'SMALLINT', + 'SMALLINT' => 'INT', + 'INT' => 'BIGINT', + 'REAL' => 'FLOAT' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql.$this->_process_column($field[$i]); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) + { + unset($attributes['CONSTRAINT']); + } + + switch (strtoupper($attributes['TYPE'])) + { + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' IDENTITY(1,1)'; + } + } + +} diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php new file mode 100644 index 0000000..8e1f416 --- /dev/null +++ b/system/database/drivers/mssql/mssql_result.php @@ -0,0 +1,198 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = mssql_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return mssql_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + mssql_field_seek($this->result_id, 0); + while ($field = mssql_fetch_field($this->result_id)) + { + $field_names[] = $field->name; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field = mssql_fetch_field($this->result_id, $i); + + $retval[$i] = new stdClass(); + $retval[$i]->name = $field->name; + $retval[$i]->type = $field->type; + $retval[$i]->max_length = $field->max_length; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + mssql_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return mssql_data_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return mssql_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + $row = mssql_fetch_object($this->result_id); + + if ($class_name === 'stdClass' OR ! $row) + { + return $row; + } + + $class_name = new $class_name(); + foreach ($row as $key => $value) + { + $class_name->$key = $value; + } + + return $class_name; + } + +} diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php new file mode 100644 index 0000000..90b7107 --- /dev/null +++ b/system/database/drivers/mssql/mssql_utility.php @@ -0,0 +1,77 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/mysql/index.html b/system/database/drivers/mysql/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/mysql/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php new file mode 100644 index 0000000..05a3283 --- /dev/null +++ b/system/database/drivers/mysql/mysql_driver.php @@ -0,0 +1,494 @@ +port)) + { + $this->hostname .= ':'.$this->port; + } + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + $client_flags = ($this->compress === FALSE) ? 0 : MYSQL_CLIENT_COMPRESS; + + if ($this->encrypt === TRUE) + { + $client_flags = $client_flags | MYSQL_CLIENT_SSL; + } + + // Error suppression is necessary mostly due to PHP 5.5+ issuing E_DEPRECATED messages + $this->conn_id = ($persistent === TRUE) + ? mysql_pconnect($this->hostname, $this->username, $this->password, $client_flags) + : mysql_connect($this->hostname, $this->username, $this->password, TRUE, $client_flags); + + // ---------------------------------------------------------------- + + // Select the DB... assuming a database name is specified in the config file + if ($this->database !== '' && ! $this->db_select()) + { + log_message('error', 'Unable to select database: '.$this->database); + + return ($this->db_debug === TRUE) + ? $this->display_error('db_unable_to_select', $this->database) + : FALSE; + } + + if (isset($this->stricton) && is_resource($this->conn_id)) + { + if ($this->stricton) + { + $this->simple_query('SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); + } + else + { + $this->simple_query( + 'SET SESSION sql_mode = + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES", ""), + "STRICT_TRANS_TABLES", "")' + ); + } + } + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @return void + */ + public function reconnect() + { + if (mysql_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + if (mysql_select_db($database, $this->conn_id)) + { + $this->database = $database; + $this->data_cache = array(); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string $charset + * @return bool + */ + protected function _db_set_charset($charset) + { + return mysql_set_charset($charset, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if ( ! $this->conn_id OR ($version = mysql_get_server_info($this->conn_id)) === FALSE) + { + return FALSE; + } + + return $this->data_cache['version'] = $version; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return mixed + */ + protected function _execute($sql) + { + return mysql_query($this->_prep_query($sql), $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @param string $sql an SQL query + * @return string + */ + protected function _prep_query($sql) + { + // mysql_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack + // modifies the query so that it a proper number of affected rows is returned. + if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) + { + return trim($sql).' WHERE 1=1'; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + $this->simple_query('SET AUTOCOMMIT=0'); + return $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if ($this->simple_query('COMMIT')) + { + $this->simple_query('SET AUTOCOMMIT=1'); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if ($this->simple_query('ROLLBACK')) + { + $this->simple_query('SET AUTOCOMMIT=1'); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependent string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return mysql_real_escape_string($str, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return mysql_affected_rows($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return mysql_insert_id($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database); + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + return array('code' => mysql_errno($this->conn_id), 'message' => mysql_error($this->conn_id)); + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + // Error suppression to avoid annoying E_WARNINGs in cases + // where the connection has already been closed for some reason. + @mysql_close($this->conn_id); + } + +} diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php new file mode 100644 index 0000000..f8a998b --- /dev/null +++ b/system/database/drivers/mysql/mysql_forge.php @@ -0,0 +1,243 @@ +db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) + { + $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; + } + + if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) + { + $sql .= ' COLLATE = '.$this->db->dbcollat; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP') + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = ($alter_type === 'ADD') + ? "\n\tADD ".$field[$i]['_literal'] + : "\n\tMODIFY ".$field[$i]['_literal']; + } + else + { + if ($alter_type === 'ADD') + { + $field[$i]['_literal'] = "\n\tADD "; + } + else + { + $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; + } + + $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); + } + } + + return array($sql.implode(',', $field)); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php new file mode 100644 index 0000000..07d5187 --- /dev/null +++ b/system/database/drivers/mysql/mysql_result.php @@ -0,0 +1,199 @@ +num_rows = mysql_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of rows in the result set + * + * @return int + */ + public function num_rows() + { + return $this->num_rows; + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return mysql_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + mysql_field_seek($this->result_id, 0); + while ($field = mysql_fetch_field($this->result_id)) + { + $field_names[] = $field->name; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = mysql_field_name($this->result_id, $i); + $retval[$i]->type = mysql_field_type($this->result_id, $i); + $retval[$i]->max_length = mysql_field_len($this->result_id, $i); + $retval[$i]->primary_key = (int) (strpos(mysql_field_flags($this->result_id, $i), 'primary_key') !== FALSE); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + mysql_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return $this->num_rows + ? mysql_data_seek($this->result_id, $n) + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return mysql_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return mysql_fetch_object($this->result_id, $class_name); + } + +} diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php new file mode 100644 index 0000000..ae3c26c --- /dev/null +++ b/system/database/drivers/mysql/mysql_utility.php @@ -0,0 +1,211 @@ +db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); + + // No result means the table name was invalid + if ($query === FALSE) + { + continue; + } + + // Write out the table schema + $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; + + if ($add_drop === TRUE) + { + $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; + } + + $i = 0; + $result = $query->result_array(); + foreach ($result[0] as $val) + { + if ($i++ % 2) + { + $output .= $val.';'.$newline.$newline; + } + } + + // If inserts are not needed we're done... + if ($add_insert === FALSE) + { + continue; + } + + // Grab all the data from the current table + $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); + + if ($query->num_rows() === 0) + { + continue; + } + + // Fetch the field names and determine if the field is an + // integer type. We use this info to decide whether to + // surround the data with quotes or not + + $i = 0; + $field_str = ''; + $is_int = array(); + while ($field = mysql_fetch_field($query->result_id)) + { + // Most versions of MySQL store timestamp as a string + $is_int[$i] = in_array(strtolower(mysql_field_type($query->result_id, $i)), + array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), + TRUE); + + // Create a string of field names + $field_str .= $this->db->escape_identifiers($field->name).', '; + $i++; + } + + // Trim off the end comma + $field_str = preg_replace('/, $/' , '', $field_str); + + // Build the insert string + foreach ($query->result_array() as $row) + { + $val_str = ''; + + $i = 0; + foreach ($row as $v) + { + // Is the value NULL? + if ($v === NULL) + { + $val_str .= 'NULL'; + } + else + { + // Escape the data if it's not an integer + $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; + } + + // Append a comma + $val_str .= ', '; + $i++; + } + + // Remove the comma at the end of the string + $val_str = preg_replace('/, $/' , '', $val_str); + + // Build the INSERT string + $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; + } + + $output .= $newline.$newline; + } + + // Do we need to include a statement to re-enable foreign key checks? + if ($foreign_key_checks === FALSE) + { + $output .= 'SET foreign_key_checks = 1;'.$newline; + } + + return $output; + } + +} diff --git a/system/database/drivers/mysqli/index.html b/system/database/drivers/mysqli/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/mysqli/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php new file mode 100644 index 0000000..7cec29e --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -0,0 +1,544 @@ +hostname[0] === '/') + { + $hostname = NULL; + $port = NULL; + $socket = $this->hostname; + } + else + { + $hostname = ($persistent === TRUE) + ? 'p:'.$this->hostname : $this->hostname; + $port = empty($this->port) ? NULL : $this->port; + $socket = NULL; + } + + $client_flags = ($this->compress === TRUE) ? MYSQLI_CLIENT_COMPRESS : 0; + $this->_mysqli = mysqli_init(); + + $this->_mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); + + if (isset($this->stricton)) + { + if ($this->stricton) + { + $this->_mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode = CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'); + } + else + { + $this->_mysqli->options(MYSQLI_INIT_COMMAND, + 'SET SESSION sql_mode = + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES", ""), + "STRICT_TRANS_TABLES", "")' + ); + } + } + + if (is_array($this->encrypt)) + { + $ssl = array(); + empty($this->encrypt['ssl_key']) OR $ssl['key'] = $this->encrypt['ssl_key']; + empty($this->encrypt['ssl_cert']) OR $ssl['cert'] = $this->encrypt['ssl_cert']; + empty($this->encrypt['ssl_ca']) OR $ssl['ca'] = $this->encrypt['ssl_ca']; + empty($this->encrypt['ssl_capath']) OR $ssl['capath'] = $this->encrypt['ssl_capath']; + empty($this->encrypt['ssl_cipher']) OR $ssl['cipher'] = $this->encrypt['ssl_cipher']; + + if ( ! empty($ssl)) + { + if (isset($this->encrypt['ssl_verify'])) + { + if ($this->encrypt['ssl_verify']) + { + defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT') && $this->_mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, TRUE); + } + // Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT + // to FALSE didn't do anything, so PHP 5.6.16 introduced yet another + // constant ... + // + // https://secure.php.net/ChangeLog-5.php#5.6.16 + // https://bugs.php.net/bug.php?id=68344 + elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT')) + { + $client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; + } + } + + $client_flags |= MYSQLI_CLIENT_SSL; + $this->_mysqli->ssl_set( + isset($ssl['key']) ? $ssl['key'] : NULL, + isset($ssl['cert']) ? $ssl['cert'] : NULL, + isset($ssl['ca']) ? $ssl['ca'] : NULL, + isset($ssl['capath']) ? $ssl['capath'] : NULL, + isset($ssl['cipher']) ? $ssl['cipher'] : NULL + ); + } + } + + if ($this->_mysqli->real_connect($hostname, $this->username, $this->password, $this->database, $port, $socket, $client_flags)) + { + // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails + if ( + ($client_flags & MYSQLI_CLIENT_SSL) + && version_compare($this->_mysqli->client_info, '5.7.3', '<=') + && empty($this->_mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value) + ) + { + $this->_mysqli->close(); + $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!'; + log_message('error', $message); + return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE; + } + + return $this->_mysqli; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @return void + */ + public function reconnect() + { + if ($this->conn_id !== FALSE && $this->conn_id->ping() === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + if ($this->conn_id->select_db($database)) + { + $this->database = $database; + $this->data_cache = array(); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string $charset + * @return bool + */ + protected function _db_set_charset($charset) + { + return $this->conn_id->set_charset($charset); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + return $this->data_cache['version'] = $this->conn_id->server_info; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return mixed + */ + protected function _execute($sql) + { + return $this->conn_id->query($this->_prep_query($sql)); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @param string $sql an SQL query + * @return string + */ + protected function _prep_query($sql) + { + // mysqli_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack + // modifies the query so that it a proper number of affected rows is returned. + if ($this->delete_hack === TRUE && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) + { + return trim($sql).' WHERE 1=1'; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + $this->conn_id->autocommit(FALSE); + return is_php('5.5') + ? $this->conn_id->begin_transaction() + : $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if ($this->conn_id->commit()) + { + $this->conn_id->autocommit(TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if ($this->conn_id->rollback()) + { + $this->conn_id->autocommit(TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependent string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return $this->conn_id->real_escape_string($str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return $this->conn_id->affected_rows; + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return $this->conn_id->insert_id; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES FROM '.$this->escape_identifiers($this->database); + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + if ( ! empty($this->_mysqli->connect_errno)) + { + return array( + 'code' => $this->_mysqli->connect_errno, + 'message' => $this->_mysqli->connect_error + ); + } + + return array('code' => $this->conn_id->errno, 'message' => $this->conn_id->error); + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + $this->conn_id->close(); + } + +} diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php new file mode 100644 index 0000000..dd77edc --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -0,0 +1,244 @@ +db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) + { + $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; + } + + if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) + { + $sql .= ' COLLATE = '.$this->db->dbcollat; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP') + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = ($alter_type === 'ADD') + ? "\n\tADD ".$field[$i]['_literal'] + : "\n\tMODIFY ".$field[$i]['_literal']; + } + else + { + if ($alter_type === 'ADD') + { + $field[$i]['_literal'] = "\n\tADD "; + } + else + { + $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; + } + + $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); + } + } + + return array($sql.implode(',', $field)); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php new file mode 100644 index 0000000..bac0737 --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -0,0 +1,232 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = $this->result_id->num_rows; + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return $this->result_id->field_count; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + $this->result_id->field_seek(0); + while ($field = $this->result_id->fetch_field()) + { + $field_names[] = $field->name; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + $field_data = $this->result_id->fetch_fields(); + for ($i = 0, $c = count($field_data); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $field_data[$i]->name; + $retval[$i]->type = static::_get_field_type($field_data[$i]->type); + $retval[$i]->max_length = $field_data[$i]->max_length; + $retval[$i]->primary_key = (int) ($field_data[$i]->flags & MYSQLI_PRI_KEY_FLAG); + $retval[$i]->default = $field_data[$i]->def; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Get field type + * + * Extracts field type info from the bitflags returned by + * mysqli_result::fetch_fields() + * + * @used-by CI_DB_mysqli_result::field_data() + * @param int $type + * @return string + */ + private static function _get_field_type($type) + { + static $map; + isset($map) OR $map = array( + MYSQLI_TYPE_DECIMAL => 'decimal', + MYSQLI_TYPE_BIT => 'bit', + MYSQLI_TYPE_TINY => 'tinyint', + MYSQLI_TYPE_SHORT => 'smallint', + MYSQLI_TYPE_INT24 => 'mediumint', + MYSQLI_TYPE_LONG => 'int', + MYSQLI_TYPE_LONGLONG => 'bigint', + MYSQLI_TYPE_FLOAT => 'float', + MYSQLI_TYPE_DOUBLE => 'double', + MYSQLI_TYPE_TIMESTAMP => 'timestamp', + MYSQLI_TYPE_DATE => 'date', + MYSQLI_TYPE_TIME => 'time', + MYSQLI_TYPE_DATETIME => 'datetime', + MYSQLI_TYPE_YEAR => 'year', + MYSQLI_TYPE_NEWDATE => 'date', + MYSQLI_TYPE_INTERVAL => 'interval', + MYSQLI_TYPE_ENUM => 'enum', + MYSQLI_TYPE_SET => 'set', + MYSQLI_TYPE_TINY_BLOB => 'tinyblob', + MYSQLI_TYPE_MEDIUM_BLOB => 'mediumblob', + MYSQLI_TYPE_BLOB => 'blob', + MYSQLI_TYPE_LONG_BLOB => 'longblob', + MYSQLI_TYPE_STRING => 'char', + MYSQLI_TYPE_VAR_STRING => 'varchar', + MYSQLI_TYPE_GEOMETRY => 'geometry' + ); + + return isset($map[$type]) ? $map[$type] : $type; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_object($this->result_id)) + { + $this->result_id->free(); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return $this->result_id->data_seek($n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return $this->result_id->fetch_assoc(); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return $this->result_id->fetch_object($class_name); + } + +} diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php new file mode 100644 index 0000000..332da60 --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_utility.php @@ -0,0 +1,211 @@ +db->query('SHOW CREATE TABLE '.$this->db->escape_identifiers($this->db->database.'.'.$table)); + + // No result means the table name was invalid + if ($query === FALSE) + { + continue; + } + + // Write out the table schema + $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; + + if ($add_drop === TRUE) + { + $output .= 'DROP TABLE IF EXISTS '.$this->db->protect_identifiers($table).';'.$newline.$newline; + } + + $i = 0; + $result = $query->result_array(); + foreach ($result[0] as $val) + { + if ($i++ % 2) + { + $output .= $val.';'.$newline.$newline; + } + } + + // If inserts are not needed we're done... + if ($add_insert === FALSE) + { + continue; + } + + // Grab all the data from the current table + $query = $this->db->query('SELECT * FROM '.$this->db->protect_identifiers($table)); + + if ($query->num_rows() === 0) + { + continue; + } + + // Fetch the field names and determine if the field is an + // integer type. We use this info to decide whether to + // surround the data with quotes or not + + $i = 0; + $field_str = ''; + $is_int = array(); + while ($field = $query->result_id->fetch_field()) + { + // Most versions of MySQL store timestamp as a string + $is_int[$i] = in_array($field->type, array(MYSQLI_TYPE_TINY, MYSQLI_TYPE_SHORT, MYSQLI_TYPE_INT24, MYSQLI_TYPE_LONG), TRUE); + + // Create a string of field names + $field_str .= $this->db->escape_identifiers($field->name).', '; + $i++; + } + + // Trim off the end comma + $field_str = preg_replace('/, $/' , '', $field_str); + + // Build the insert string + foreach ($query->result_array() as $row) + { + $val_str = ''; + + $i = 0; + foreach ($row as $v) + { + // Is the value NULL? + if ($v === NULL) + { + $val_str .= 'NULL'; + } + else + { + // Escape the data if it's not an integer + $val_str .= ($is_int[$i] === FALSE) ? $this->db->escape($v) : $v; + } + + // Append a comma + $val_str .= ', '; + $i++; + } + + // Remove the comma at the end of the string + $val_str = preg_replace('/, $/' , '', $val_str); + + // Build the INSERT string + $output .= 'INSERT INTO '.$this->db->protect_identifiers($table).' ('.$field_str.') VALUES ('.$val_str.');'.$newline; + } + + $output .= $newline.$newline; + } + + // Do we need to include a statement to re-enable foreign key checks? + if ($foreign_key_checks === FALSE) + { + $output .= 'SET foreign_key_checks = 1;'.$newline; + } + + return $output; + } + +} diff --git a/system/database/drivers/oci8/index.html b/system/database/drivers/oci8/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/oci8/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php new file mode 100644 index 0000000..b90db4b --- /dev/null +++ b/system/database/drivers/oci8/oci8_driver.php @@ -0,0 +1,701 @@ + '/^\(DESCRIPTION=(\(.+\)){2,}\)$/', // TNS + // Easy Connect string (Oracle 10g+) + 'ec' => '/^(\/\/)?[a-z0-9.:_-]+(:[1-9][0-9]{0,4})?(\/[a-z0-9$_]+)?(:[^\/])?(\/[a-z0-9$_]+)?$/i', + 'in' => '/^[a-z0-9$_]+$/i' // Instance name (defined in tnsnames.ora) + ); + + /* Space characters don't have any effect when actually + * connecting, but can be a hassle while validating the DSN. + */ + $this->dsn = str_replace(array("\n", "\r", "\t", ' '), '', $this->dsn); + + if ($this->dsn !== '') + { + foreach ($valid_dsns as $regexp) + { + if (preg_match($regexp, $this->dsn)) + { + return; + } + } + } + + // Legacy support for TNS in the hostname configuration field + $this->hostname = str_replace(array("\n", "\r", "\t", ' '), '', $this->hostname); + if (preg_match($valid_dsns['tns'], $this->hostname)) + { + $this->dsn = $this->hostname; + return; + } + elseif ($this->hostname !== '' && strpos($this->hostname, '/') === FALSE && strpos($this->hostname, ':') === FALSE + && (( ! empty($this->port) && ctype_digit($this->port)) OR $this->database !== '')) + { + /* If the hostname field isn't empty, doesn't contain + * ':' and/or '/' and if port and/or database aren't + * empty, then the hostname field is most likely indeed + * just a hostname. Therefore we'll try and build an + * Easy Connect string from these 3 settings, assuming + * that the database field is a service name. + */ + $this->dsn = $this->hostname + .(( ! empty($this->port) && ctype_digit($this->port)) ? ':'.$this->port : '') + .($this->database !== '' ? '/'.ltrim($this->database, '/') : ''); + + if (preg_match($valid_dsns['ec'], $this->dsn)) + { + return; + } + } + + /* At this point, we can only try and validate the hostname and + * database fields separately as DSNs. + */ + if (preg_match($valid_dsns['ec'], $this->hostname) OR preg_match($valid_dsns['in'], $this->hostname)) + { + $this->dsn = $this->hostname; + return; + } + + $this->database = str_replace(array("\n", "\r", "\t", ' '), '', $this->database); + foreach ($valid_dsns as $regexp) + { + if (preg_match($regexp, $this->database)) + { + return; + } + } + + /* Well - OK, an empty string should work as well. + * PHP will try to use environment variables to + * determine which Oracle instance to connect to. + */ + $this->dsn = ''; + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + $func = ($persistent === TRUE) ? 'oci_pconnect' : 'oci_connect'; + return empty($this->char_set) + ? $func($this->username, $this->password, $this->dsn) + : $func($this->username, $this->password, $this->dsn, $this->char_set); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if ( ! $this->conn_id OR ($version_string = oci_server_version($this->conn_id)) === FALSE) + { + return FALSE; + } + elseif (preg_match('#Release\s(\d+(?:\.\d+)+)#', $version_string, $match)) + { + return $this->data_cache['version'] = $match[1]; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + /* Oracle must parse the query before it is run. All of the actions with + * the query are based on the statement id returned by oci_parse(). + */ + if ($this->_reset_stmt_id === TRUE) + { + $this->stmt_id = oci_parse($this->conn_id, $sql); + } + + oci_set_prefetch($this->stmt_id, 1000); + return oci_execute($this->stmt_id, $this->commit_mode); + } + + // -------------------------------------------------------------------- + + /** + * Get cursor. Returns a cursor from the database + * + * @return resource + */ + public function get_cursor() + { + return $this->curs_id = oci_new_cursor($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Stored Procedure. Executes a stored procedure + * + * @param string package name in which the stored procedure is in + * @param string stored procedure name to execute + * @param array parameters + * @return mixed + * + * params array keys + * + * KEY OPTIONAL NOTES + * name no the name of the parameter should be in : format + * value no the value of the parameter. If this is an OUT or IN OUT parameter, + * this should be a reference to a variable + * type yes the type of the parameter + * length yes the max size of the parameter + */ + public function stored_procedure($package, $procedure, array $params) + { + if ($package === '' OR $procedure === '') + { + log_message('error', 'Invalid query: '.$package.'.'.$procedure); + return ($this->db_debug) ? $this->display_error('db_invalid_query') : FALSE; + } + + // Build the query string + $sql = 'BEGIN '.$package.'.'.$procedure.'('; + + $have_cursor = FALSE; + foreach ($params as $param) + { + $sql .= $param['name'].','; + + if (isset($param['type']) && $param['type'] === OCI_B_CURSOR) + { + $have_cursor = TRUE; + } + } + $sql = trim($sql, ',').'); END;'; + + $this->_reset_stmt_id = FALSE; + $this->stmt_id = oci_parse($this->conn_id, $sql); + $this->_bind_params($params); + $result = $this->query($sql, FALSE, $have_cursor); + $this->_reset_stmt_id = TRUE; + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Bind parameters + * + * @param array $params + * @return void + */ + protected function _bind_params($params) + { + if ( ! is_array($params) OR ! is_resource($this->stmt_id)) + { + return; + } + + foreach ($params as $param) + { + foreach (array('name', 'value', 'type', 'length') as $val) + { + if ( ! isset($param[$val])) + { + $param[$val] = ''; + } + } + + oci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']); + } + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + $this->commit_mode = OCI_NO_AUTO_COMMIT; + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + $this->commit_mode = OCI_COMMIT_ON_SUCCESS; + + return oci_commit($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + $this->commit_mode = OCI_COMMIT_ON_SUCCESS; + return oci_rollback($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return oci_num_rows($this->stmt_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + // not supported in oracle + return $this->display_error('db_unsupported_function'); + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS + WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' + AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE + FROM ALL_TAB_COLUMNS + WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' + AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + + $length = ($query[$i]->CHAR_LENGTH > 0) + ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; + if ($length === NULL) + { + $length = $query[$i]->DATA_LENGTH; + } + $retval[$i]->max_length = $length; + + $default = $query[$i]->DATA_DEFAULT; + if ($default === NULL && $query[$i]->NULLABLE === 'N') + { + $default = ''; + } + $retval[$i]->default = $default; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + // oci_error() returns an array that already contains + // 'code' and 'message' keys, but it can return false + // if there was no error .... + if (is_resource($this->curs_id)) + { + $error = oci_error($this->curs_id); + } + elseif (is_resource($this->stmt_id)) + { + $error = oci_error($this->stmt_id); + } + elseif (is_resource($this->conn_id)) + { + $error = oci_error($this->conn_id); + } + else + { + $error = oci_error(); + } + + return is_array($error) + ? $error + : array('code' => '', 'message' => ''); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _insert_batch($table, $keys, $values) + { + $keys = implode(', ', $keys); + $sql = "INSERT ALL\n"; + + for ($i = 0, $c = count($values); $i < $c; $i++) + { + $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; + } + + return $sql.'SELECT * FROM dual'; + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + $this->where('rownum <= ',$this->qb_limit, FALSE); + $this->qb_limit = FALSE; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + if (version_compare($this->version(), '12.1', '>=')) + { + // OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + + $this->limit_used = TRUE; + return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' + .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1) : ''); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + oci_close($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * We need to reset our $limit_used hack flag, so it doesn't propagate + * to subsequent queries. + * + * @return void + */ + protected function _reset_select() + { + $this->limit_used = FALSE; + parent::_reset_select(); + } +} diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php new file mode 100644 index 0000000..0011bb0 --- /dev/null +++ b/system/database/drivers/oci8/oci8_forge.php @@ -0,0 +1,187 @@ +db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = "\n\t".$field[$i]['_literal']; + } + else + { + $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); + + if ( ! empty($field[$i]['comment'])) + { + $sqls[] = 'COMMENT ON COLUMN ' + .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) + .' IS '.$field[$i]['comment']; + } + + if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + + $field[$i] = "\n\t".$field[$i]['_literal']; + } + } + + $sql .= ' '.$alter_type.' '; + $sql .= (count($field) === 1) + ? $field[0] + : '('.implode(',', $field).')'; + + // RENAME COLUMN must be executed after MODIFY + array_unshift($sqls, $sql); + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported - sequences and triggers must be used instead + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'INT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'NUMBER'; + return; + default: return; + } + } +} diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php new file mode 100644 index 0000000..1c4196f --- /dev/null +++ b/system/database/drivers/oci8/oci8_result.php @@ -0,0 +1,229 @@ +stmt_id = $driver_object->stmt_id; + $this->curs_id = $driver_object->curs_id; + $this->limit_used = $driver_object->limit_used; + $this->commit_mode =& $driver_object->commit_mode; + $driver_object->stmt_id = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + $count = oci_num_fields($this->stmt_id); + + // if we used a limit we subtract it + return ($this->limit_used) ? $count - 1 : $count; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) + { + $field_names[] = oci_field_name($this->stmt_id, $c); + } + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) + { + $F = new stdClass(); + $F->name = oci_field_name($this->stmt_id, $c); + $F->type = oci_field_type($this->stmt_id, $c); + $F->max_length = oci_field_size($this->stmt_id, $c); + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + oci_free_statement($this->result_id); + $this->result_id = FALSE; + } + + if (is_resource($this->stmt_id)) + { + oci_free_statement($this->stmt_id); + } + + if (is_resource($this->curs_id)) + { + oci_cancel($this->curs_id); + $this->curs_id = NULL; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; + return oci_fetch_assoc($id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + $row = ($this->curs_id) + ? oci_fetch_object($this->curs_id) + : oci_fetch_object($this->stmt_id); + + if ($class_name === 'stdClass' OR ! $row) + { + return $row; + } + + $class_name = new $class_name(); + foreach ($row as $key => $value) + { + $class_name->$key = $value; + } + + return $class_name; + } + +} diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php new file mode 100644 index 0000000..574ff68 --- /dev/null +++ b/system/database/drivers/oci8/oci8_utility.php @@ -0,0 +1,68 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/odbc/index.html b/system/database/drivers/odbc/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/odbc/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php new file mode 100644 index 0000000..c853903 --- /dev/null +++ b/system/database/drivers/odbc/odbc_driver.php @@ -0,0 +1,425 @@ +dsn)) + { + $this->dsn = $this->hostname; + } + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + return ($persistent === TRUE) + ? odbc_pconnect($this->dsn, $this->username, $this->password) + : odbc_connect($this->dsn, $this->username, $this->password); + } + + // -------------------------------------------------------------------- + + /** + * Compile Bindings + * + * @param string $sql SQL statement + * @param array $binds An array of values to bind + * @return string + */ + public function compile_binds($sql, $binds) + { + if (empty($binds) OR empty($this->bind_marker) OR strpos($sql, $this->bind_marker) === FALSE) + { + return $sql; + } + elseif ( ! is_array($binds)) + { + $binds = array($binds); + $bind_count = 1; + } + else + { + // Make sure we're using numeric keys + $binds = array_values($binds); + $bind_count = count($binds); + } + + // We'll need the marker length later + $ml = strlen($this->bind_marker); + + // Make sure not to replace a chunk inside a string that happens to match the bind marker + if ($c = preg_match_all("/'[^']*'|\"[^\"]*\"/i", $sql, $matches)) + { + $c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', + str_replace($matches[0], + str_replace($this->bind_marker, str_repeat(' ', $ml), $matches[0]), + $sql, $c), + $matches, PREG_OFFSET_CAPTURE); + + // Bind values' count must match the count of markers in the query + if ($bind_count !== $c) + { + return $sql; + } + } + elseif (($c = preg_match_all('/'.preg_quote($this->bind_marker, '/').'/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bind_count) + { + return $sql; + } + + if ($this->bind_marker !== '?') + { + do + { + $c--; + $sql = substr_replace($sql, '?', $matches[0][$c][1], $ml); + } + while ($c !== 0); + } + + if (FALSE !== ($this->odbc_result = odbc_prepare($this->conn_id, $sql))) + { + $this->binds = array_values($binds); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + if ( ! isset($this->odbc_result)) + { + return odbc_exec($this->conn_id, $sql); + } + elseif ($this->odbc_result === FALSE) + { + return FALSE; + } + + if (TRUE === ($success = odbc_execute($this->odbc_result, $this->binds))) + { + // For queries that return result sets, return the result_id resource on success + $this->is_write_type($sql) OR $success = $this->odbc_result; + } + + $this->odbc_result = NULL; + $this->binds = array(); + + return $success; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return odbc_autocommit($this->conn_id, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if (odbc_commit($this->conn_id)) + { + odbc_autocommit($this->conn_id, TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if (odbc_rollback($this->conn_id)) + { + odbc_autocommit($this->conn_id, TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependent string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + $this->display_error('db_unsupported_feature'); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return odbc_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return bool + */ + public function insert_id() + { + return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @param string $table + * @return string + */ + protected function _field_data($table) + { + return 'SELECT TOP 1 FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + return array('code' => odbc_error($this->conn_id), 'message' => odbc_errormsg($this->conn_id)); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + odbc_close($this->conn_id); + } +} diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php new file mode 100644 index 0000000..761e81f --- /dev/null +++ b/system/database/drivers/odbc/odbc_forge.php @@ -0,0 +1,86 @@ +num_rows)) + { + return $this->num_rows; + } + elseif (($this->num_rows = odbc_num_rows($this->result_id)) !== -1) + { + return $this->num_rows; + } + + // Work-around for ODBC subdrivers that don't support num_rows() + if (count($this->result_array) > 0) + { + return $this->num_rows = count($this->result_array); + } + elseif (count($this->result_object) > 0) + { + return $this->num_rows = count($this->result_object); + } + + return $this->num_rows = count($this->result_array()); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return odbc_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + $num_fields = $this->num_fields(); + + if ($num_fields > 0) + { + for ($i = 1; $i <= $num_fields; $i++) + { + $field_names[] = odbc_field_name($this->result_id, $i); + } + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $odbc_index = 1, $c = $this->num_fields(); $i < $c; $i++, $odbc_index++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = odbc_field_name($this->result_id, $odbc_index); + $retval[$i]->type = odbc_field_type($this->result_id, $odbc_index); + $retval[$i]->max_length = odbc_field_len($this->result_id, $odbc_index); + $retval[$i]->primary_key = 0; + $retval[$i]->default = ''; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + odbc_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return odbc_fetch_array($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + $row = odbc_fetch_object($this->result_id); + + if ($class_name === 'stdClass' OR ! $row) + { + return $row; + } + + $class_name = new $class_name(); + foreach ($row as $key => $value) + { + $class_name->$key = $value; + } + + return $class_name; + } + +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('odbc_fetch_array')) +{ + /** + * ODBC Fetch array + * + * Emulates the native odbc_fetch_array() function when + * it is not available (odbc_fetch_array() requires unixODBC) + * + * @param resource &$result + * @param int $rownumber + * @return array + */ + function odbc_fetch_array(&$result, $rownumber = 1) + { + $rs = array(); + if ( ! odbc_fetch_into($result, $rs, $rownumber)) + { + return FALSE; + } + + $rs_assoc = array(); + foreach ($rs as $k => $v) + { + $field_name = odbc_field_name($result, $k+1); + $rs_assoc[$field_name] = $v; + } + + return $rs_assoc; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('odbc_fetch_object')) +{ + /** + * ODBC Fetch object + * + * Emulates the native odbc_fetch_object() function when + * it is not available. + * + * @param resource &$result + * @param int $rownumber + * @return object + */ + function odbc_fetch_object(&$result, $rownumber = 1) + { + $rs = array(); + if ( ! odbc_fetch_into($result, $rs, $rownumber)) + { + return FALSE; + } + + $rs_object = new stdClass(); + foreach ($rs as $k => $v) + { + $field_name = odbc_field_name($result, $k+1); + $rs_object->$field_name = $v; + } + + return $rs_object; + } +} diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php new file mode 100644 index 0000000..2a33428 --- /dev/null +++ b/system/database/drivers/odbc/odbc_utility.php @@ -0,0 +1,63 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/pdo/index.html b/system/database/drivers/pdo/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/pdo/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php new file mode 100644 index 0000000..c99bb06 --- /dev/null +++ b/system/database/drivers/pdo/pdo_driver.php @@ -0,0 +1,329 @@ +dsn, $match) && count($match) === 2) + { + // If there is a minimum valid dsn string pattern found, we're done + // This is for general PDO users, who tend to have a full DSN string. + $this->subdriver = $match[1]; + return; + } + // Legacy support for DSN specified in the hostname field + elseif (preg_match('/([^:]+):/', $this->hostname, $match) && count($match) === 2) + { + $this->dsn = $this->hostname; + $this->hostname = NULL; + $this->subdriver = $match[1]; + return; + } + elseif (in_array($this->subdriver, array('mssql', 'sybase'), TRUE)) + { + $this->subdriver = 'dblib'; + } + elseif ($this->subdriver === '4D') + { + $this->subdriver = '4d'; + } + elseif ( ! in_array($this->subdriver, array('4d', 'cubrid', 'dblib', 'firebird', 'ibm', 'informix', 'mysql', 'oci', 'odbc', 'pgsql', 'sqlite', 'sqlsrv'), TRUE)) + { + log_message('error', 'PDO: Invalid or non-existent subdriver'); + + if ($this->db_debug) + { + show_error('Invalid or non-existent PDO subdriver'); + } + } + + $this->dsn = NULL; + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + if ($persistent === TRUE) + { + $this->options[PDO::ATTR_PERSISTENT] = TRUE; + } + + try + { + return new PDO($this->dsn, $this->username, $this->password, $this->options); + } + catch (PDOException $e) + { + if ($this->db_debug && empty($this->failover)) + { + $this->display_error($e->getMessage(), '', TRUE); + } + + return FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + // Not all subdrivers support the getAttribute() method + try + { + return $this->data_cache['version'] = $this->conn_id->getAttribute(PDO::ATTR_SERVER_VERSION); + } + catch (PDOException $e) + { + return parent::version(); + } + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql SQL query + * @return mixed + */ + protected function _execute($sql) + { + return $this->conn_id->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return $this->conn_id->beginTransaction(); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return $this->conn_id->commit(); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return $this->conn_id->rollBack(); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependent string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + // Escape the string + $str = $this->conn_id->quote($str); + + // If there are duplicated quotes, trim them away + return ($str[0] === "'") + ? substr($str, 1, -1) + : $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return is_object($this->result_id) ? $this->result_id->rowCount() : 0; + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @param string $name + * @return int + */ + public function insert_id($name = NULL) + { + return $this->conn_id->lastInsertId($name); + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @param string $table + * @return string + */ + protected function _field_data($table) + { + return 'SELECT TOP 1 * FROM '.$this->protect_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + $error = array('code' => '00000', 'message' => ''); + $pdo_error = $this->conn_id->errorInfo(); + + if (empty($pdo_error[0])) + { + return $error; + } + + $error['code'] = isset($pdo_error[1]) ? $pdo_error[0].'/'.$pdo_error[1] : $pdo_error[0]; + if (isset($pdo_error[2])) + { + $error['message'] = $pdo_error[2]; + } + + return $error; + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE '.$table; + } + +} diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php new file mode 100644 index 0000000..c77a849 --- /dev/null +++ b/system/database/drivers/pdo/pdo_forge.php @@ -0,0 +1,65 @@ +num_rows)) + { + return $this->num_rows; + } + elseif (count($this->result_array) > 0) + { + return $this->num_rows = count($this->result_array); + } + elseif (count($this->result_object) > 0) + { + return $this->num_rows = count($this->result_object); + } + elseif (($num_rows = $this->result_id->rowCount()) > 0) + { + return $this->num_rows = $num_rows; + } + + return $this->num_rows = count($this->result_array()); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return $this->result_id->columnCount(); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return bool + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + // Might trigger an E_WARNING due to not all subdrivers + // supporting getColumnMeta() + $field_names[$i] = @$this->result_id->getColumnMeta($i); + $field_names[$i] = $field_names[$i]['name']; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + try + { + $retval = array(); + + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field = $this->result_id->getColumnMeta($i); + + $retval[$i] = new stdClass(); + $retval[$i]->name = $field['name']; + $retval[$i]->type = $field['native_type']; + $retval[$i]->max_length = ($field['len'] > 0) ? $field['len'] : NULL; + $retval[$i]->primary_key = (int) ( ! empty($field['flags']) && in_array('primary_key', $field['flags'], TRUE)); + } + + return $retval; + } + catch (Exception $e) + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsupported_feature'); + } + + return FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_object($this->result_id)) + { + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return $this->result_id->fetch(PDO::FETCH_ASSOC); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return $this->result_id->fetchObject($class_name); + } + +} diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php new file mode 100644 index 0000000..9091ea5 --- /dev/null +++ b/system/database/drivers/pdo/pdo_utility.php @@ -0,0 +1,63 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/index.html b/system/database/drivers/pdo/subdrivers/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php new file mode 100644 index 0000000..bbb675d --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_driver.php @@ -0,0 +1,200 @@ +dsn)) + { + $this->dsn = '4D:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ';port='.$this->port; + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + } + elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 3) === FALSE) + { + $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('TABLE_NAME').' FROM '.$this->escape_identifiers('_USER_TABLES'); + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' WHERE '.$this->escape_identifiers('TABLE_NAME')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT '.$this->escape_identifiers('COLUMN_NAME').' FROM '.$this->escape_identifiers('_USER_COLUMNS') + .' WHERE '.$this->escape_identifiers('TABLE_NAME').' = '.$this->escape($table); + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @param string $table + * @return string + */ + protected function _field_data($table) + { + return 'SELECT * FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE).' LIMIT 1'; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php new file mode 100644 index 0000000..7135aa1 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_4d_forge.php @@ -0,0 +1,217 @@ + 'INT', + 'SMALLINT' => 'INT', + 'INT' => 'INT64', + 'INT32' => 'INT64' + ); + + /** + * DEFAULT value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_default = FALSE; + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + // No method of modifying columns is supported + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'].$field['length'] + .$field['null'] + .$field['unique'] + .$field['auto_increment']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'INT64'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNIQUE + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unique(&$attributes, &$field) + { + if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) + { + $field['unique'] = ' UNIQUE'; + + // UNIQUE must be used with NOT NULL + $field['null'] = ' NOT NULL'; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) + { + if (stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' AUTO_INCREMENT'; + } + elseif (strcasecmp($field['type'], 'UUID') === 0) + { + $field['auto_increment'] = ' AUTO_GENERATE'; + } + } + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php new file mode 100644 index 0000000..3189aab --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_driver.php @@ -0,0 +1,209 @@ +dsn)) + { + $this->dsn = 'cubrid:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ';port='.$this->port; + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES'; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php new file mode 100644 index 0000000..624ce51 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_cubrid_forge.php @@ -0,0 +1,230 @@ + 'INTEGER', + 'SMALLINT' => 'INTEGER', + 'INT' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'BIGINT' => 'NUMERIC', + 'FLOAT' => 'DOUBLE', + 'REAL' => 'DOUBLE' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $sqls[] = $sql.' CHANGE '.$field[$i]['_literal']; + } + else + { + $alter_type = empty($field[$i]['new_name']) ? ' MODIFY ' : ' CHANGE '; + $sqls[] = $sql.$alter_type.$this->_process_column($field[$i]); + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'LONGTEXT': + $attributes['TYPE'] = 'STRING'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php new file mode 100644 index 0000000..d04f8b3 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_driver.php @@ -0,0 +1,353 @@ +dsn)) + { + $this->dsn = $params['subdriver'].':host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + if ( ! empty($this->port)) + { + $this->dsn .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':').$this->port; + } + + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + empty($this->appname) OR $this->dsn .= ';appname='.$this->appname; + } + else + { + if ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) + { + $this->dsn .= ';charset='.$this->char_set; + } + + $this->subdriver = 'dblib'; + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + if ($persistent === TRUE) + { + log_message('debug', "dblib driver doesn't support persistent connections"); + } + + $this->conn_id = parent::db_connect(FALSE); + + if ( ! is_object($this->conn_id)) + { + return $this->conn_id; + } + + // Determine how identifiers are escaped + $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); + $query = $query->row_array(); + $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; + $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('name') + .' FROM '.$this->escape_identifiers('sysobjects') + .' WHERE '.$this->escape_identifiers('type')." = 'U'"; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql.' ORDER BY '.$this->escape_identifiers('name'); + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + $limit = $this->qb_offset + $this->qb_limit; + + // As of SQL Server 2005 (9.0.*) ROW_NUMBER() is supported, + // however an ORDER BY clause is required for it to work + if (version_compare($this->version(), '9', '>=') && $this->qb_offset && ! empty($this->qb_orderby)) + { + $orderby = $this->_compile_order_by(); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); + + // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results + if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) + { + $select = '*'; // Inevitable + } + else + { + // Use only field names and their aliases, everything else is out of our scope. + $select = array(); + $field_regexp = ($this->_quoted_identifier) + ? '("[^\"]+")' : '(\[[^\]]+\])'; + for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) + { + $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) + ? $m[1] : $this->qb_select[$i]; + } + $select = implode(', ', $select); + } + + return 'SELECT '.$select." FROM (\n\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + // Multiple-value inserts are only supported as of SQL Server 2008 + if (version_compare($this->version(), '10', '>=')) + { + return parent::_insert_batch($table, $keys, $values); + } + + return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + return $this->data_cache['version'] = $this->conn_id->query("SELECT SERVERPROPERTY('ProductVersion') AS ver")->fetchColumn(0); + } +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php new file mode 100644 index 0000000..0216b59 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_dblib_forge.php @@ -0,0 +1,149 @@ + 'SMALLINT', + 'SMALLINT' => 'INT', + 'INT' => 'BIGINT', + 'REAL' => 'FLOAT' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql.$this->_process_column($field[$i]); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) + { + unset($attributes['CONSTRAINT']); + } + + switch (strtoupper($attributes['TYPE'])) + { + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' IDENTITY(1,1)'; + } + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php new file mode 100644 index 0000000..eec5bf2 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_driver.php @@ -0,0 +1,279 @@ +dsn)) + { + $this->dsn = 'firebird:'; + + if ( ! empty($this->database)) + { + $this->dsn .= 'dbname='.$this->database; + } + elseif ( ! empty($this->hostname)) + { + $this->dsn .= 'dbname='.$this->hostname; + } + + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + empty($this->role) OR $this->dsn .= ';role='.$this->role; + } + elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 9) === FALSE) + { + $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "RDB$RELATION_NAME" FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\''; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql.' AND "RDB$RELATION_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT "RDB$FIELD_NAME" FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = '.$this->escape($table); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "rfields"."RDB$FIELD_NAME" AS "name", + CASE "fields"."RDB$FIELD_TYPE" + WHEN 7 THEN \'SMALLINT\' + WHEN 8 THEN \'INTEGER\' + WHEN 9 THEN \'QUAD\' + WHEN 10 THEN \'FLOAT\' + WHEN 11 THEN \'DFLOAT\' + WHEN 12 THEN \'DATE\' + WHEN 13 THEN \'TIME\' + WHEN 14 THEN \'CHAR\' + WHEN 16 THEN \'INT64\' + WHEN 27 THEN \'DOUBLE\' + WHEN 35 THEN \'TIMESTAMP\' + WHEN 37 THEN \'VARCHAR\' + WHEN 40 THEN \'CSTRING\' + WHEN 261 THEN \'BLOB\' + ELSE NULL + END AS "type", + "fields"."RDB$FIELD_LENGTH" AS "max_length", + "rfields"."RDB$DEFAULT_VALUE" AS "default" + FROM "RDB$RELATION_FIELDS" "rfields" + JOIN "RDB$FIELDS" "fields" ON "rfields"."RDB$FIELD_SOURCE" = "fields"."RDB$FIELD_NAME" + WHERE "rfields"."RDB$RELATION_NAME" = '.$this->escape($table).' + ORDER BY "rfields"."RDB$FIELD_POSITION"'; + + return (($query = $this->query($sql)) !== FALSE) + ? $query->result_object() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + // Limit clause depends on if Interbase or Firebird + if (stripos($this->version(), 'firebird') !== FALSE) + { + $select = 'FIRST '.$this->qb_limit + .($this->qb_offset > 0 ? ' SKIP '.$this->qb_offset : ''); + } + else + { + $select = 'ROWS ' + .($this->qb_offset > 0 ? $this->qb_offset.' TO '.($this->qb_limit + $this->qb_offset) : $this->qb_limit); + } + + return preg_replace('`SELECT`i', 'SELECT '.$select, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; + } +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php new file mode 100644 index 0000000..2a5fa64 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_firebird_forge.php @@ -0,0 +1,237 @@ + 'INTEGER', + 'INTEGER' => 'INT64', + 'FLOAT' => 'DOUBLE PRECISION' + ); + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_null = 'NULL'; + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name + * @return string + */ + public function create_database($db_name) + { + // Firebird databases are flat files, so a path is required + + // Hostname is needed for remote access + empty($this->db->hostname) OR $db_name = $this->hostname.':'.$db_name; + + return parent::create_database('"'.$db_name.'"'); + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name (ignored) + * @return bool + */ + public function drop_database($db_name) + { + if ( ! ibase_drop_db($this->conn_id)) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + return FALSE; + } + + if (isset($field[$i]['type'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TYPE '.$field[$i]['type'].$field[$i]['length']; + } + + if ( ! empty($field[$i]['default'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' SET DEFAULT '.$field[$i]['default']; + } + + if (isset($field[$i]['null'])) + { + $sqls[] = 'UPDATE "RDB$RELATION_FIELDS" SET "RDB$NULL_FLAG" = ' + .($field[$i]['null'] === TRUE ? 'NULL' : '1') + .' WHERE "RDB$FIELD_NAME" = '.$this->db->escape($field[$i]['name']) + .' AND "RDB$RELATION_NAME" = '.$this->db->escape($table); + } + + if ( ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'].$field['length'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INT': + $attributes['TYPE'] = 'INTEGER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'INT64'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php new file mode 100644 index 0000000..43400a4 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_driver.php @@ -0,0 +1,244 @@ +dsn)) + { + $this->dsn = 'ibm:'; + + // Pre-defined DSN + if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) + { + if (isset($this->DSN)) + { + $this->dsn .= 'DSN='.$this->DSN; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DSN='.$this->database; + } + + return; + } + + $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; + + if (isset($this->DATABASE)) + { + $this->dsn .= 'DATABASE='.$this->DATABASE.';'; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DATABASE='.$this->database.';'; + } + + if (isset($this->HOSTNAME)) + { + $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; + } + else + { + $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); + } + + if (isset($this->PORT)) + { + $this->dsn .= 'PORT='.$this->port.';'; + } + elseif ( ! empty($this->port)) + { + $this->dsn .= ';PORT='.$this->port.';'; + } + + $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "tabname" FROM "syscat"."tables" + WHERE "type" = \'T\' AND LOWER("tabschema") = '.$this->escape(strtolower($this->database)); + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return array + */ + protected function _list_columns($table = '') + { + return 'SELECT "colname" FROM "syscat"."columns" + WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' + AND LOWER("tabname") = '.$this->escape(strtolower($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "colname" AS "name", "typename" AS "type", "default" AS "default", "length" AS "max_length", + CASE "keyseq" WHEN NULL THEN 0 ELSE 1 END AS "primary_key" + FROM "syscat"."columns" + WHERE LOWER("tabschema") = '.$this->escape(strtolower($this->database)).' + AND LOWER("tabname") = '.$this->escape(strtolower($table)).' + ORDER BY "colno"'; + + return (($query = $this->query($sql)) !== FALSE) + ? $query->result_object() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + $sql .= ' FETCH FIRST '.($this->qb_limit + $this->qb_offset).' ROWS ONLY'; + + return ($this->qb_offset) + ? 'SELECT * FROM ('.$sql.') WHERE rownum > '.$this->qb_offset + : $sql; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php new file mode 100644 index 0000000..f1bd2c3 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_ibm_forge.php @@ -0,0 +1,154 @@ + 'INTEGER', + 'INT' => 'BIGINT', + 'INTEGER' => 'BIGINT' + ); + + /** + * DEFAULT value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_default = FALSE; + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'CHANGE') + { + $alter_type = 'MODIFY'; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNIQUE + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unique(&$attributes, &$field) + { + if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) + { + $field['unique'] = ' UNIQUE'; + + // UNIQUE must be used with NOT NULL + $field['null'] = ' NOT NULL'; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php new file mode 100644 index 0000000..e44dcb8 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_driver.php @@ -0,0 +1,309 @@ +dsn)) + { + $this->dsn = 'informix:'; + + // Pre-defined DSN + if (empty($this->hostname) && empty($this->host) && empty($this->port) && empty($this->service)) + { + if (isset($this->DSN)) + { + $this->dsn .= 'DSN='.$this->DSN; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DSN='.$this->database; + } + + return; + } + + if (isset($this->host)) + { + $this->dsn .= 'host='.$this->host; + } + else + { + $this->dsn .= 'host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + } + + if (isset($this->service)) + { + $this->dsn .= '; service='.$this->service; + } + elseif ( ! empty($this->port)) + { + $this->dsn .= '; service='.$this->port; + } + + empty($this->database) OR $this->dsn .= '; database='.$this->database; + empty($this->server) OR $this->dsn .= '; server='.$this->server; + + $this->dsn .= '; protocol='.(isset($this->protocol) ? $this->protocol : 'onsoctcp') + .'; EnableScrollableCursors=1'; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "tabname" FROM "systables" + WHERE "tabid" > 99 AND "tabtype" = \'T\' AND LOWER("owner") = '.$this->escape(strtolower($this->username)); + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND "tabname" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + return 'SELECT "colname" FROM "systables", "syscolumns" + WHERE "systables"."tabid" = "syscolumns"."tabid" + AND "systables"."tabtype" = \'T\' + AND LOWER("systables"."owner") = '.$this->escape(strtolower($owner)).' + AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "syscolumns"."colname" AS "name", + CASE "syscolumns"."coltype" + WHEN 0 THEN \'CHAR\' + WHEN 1 THEN \'SMALLINT\' + WHEN 2 THEN \'INTEGER\' + WHEN 3 THEN \'FLOAT\' + WHEN 4 THEN \'SMALLFLOAT\' + WHEN 5 THEN \'DECIMAL\' + WHEN 6 THEN \'SERIAL\' + WHEN 7 THEN \'DATE\' + WHEN 8 THEN \'MONEY\' + WHEN 9 THEN \'NULL\' + WHEN 10 THEN \'DATETIME\' + WHEN 11 THEN \'BYTE\' + WHEN 12 THEN \'TEXT\' + WHEN 13 THEN \'VARCHAR\' + WHEN 14 THEN \'INTERVAL\' + WHEN 15 THEN \'NCHAR\' + WHEN 16 THEN \'NVARCHAR\' + WHEN 17 THEN \'INT8\' + WHEN 18 THEN \'SERIAL8\' + WHEN 19 THEN \'SET\' + WHEN 20 THEN \'MULTISET\' + WHEN 21 THEN \'LIST\' + WHEN 22 THEN \'Unnamed ROW\' + WHEN 40 THEN \'LVARCHAR\' + WHEN 41 THEN \'BLOB/CLOB/BOOLEAN\' + WHEN 4118 THEN \'Named ROW\' + ELSE "syscolumns"."coltype" + END AS "type", + "syscolumns"."collength" as "max_length", + CASE "sysdefaults"."type" + WHEN \'L\' THEN "sysdefaults"."default" + ELSE NULL + END AS "default" + FROM "syscolumns", "systables", "sysdefaults" + WHERE "syscolumns"."tabid" = "systables"."tabid" + AND "systables"."tabid" = "sysdefaults"."tabid" + AND "syscolumns"."colno" = "sysdefaults"."colno" + AND "systables"."tabtype" = \'T\' + AND LOWER("systables"."owner") = '.$this->escape(strtolower($this->username)).' + AND LOWER("systables"."tabname") = '.$this->escape(strtolower($table)).' + ORDER BY "syscolumns"."colno"'; + + return (($query = $this->query($sql)) !== FALSE) + ? $query->result_object() + : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE ONLY '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql $SQL Query + * @return string + */ + protected function _limit($sql) + { + $select = 'SELECT '.($this->qb_offset ? 'SKIP '.$this->qb_offset : '').'FIRST '.$this->qb_limit.' '; + return preg_replace('/^(SELECT\s)/i', $select, $sql, 1); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php new file mode 100644 index 0000000..e4202c2 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_informix_forge.php @@ -0,0 +1,163 @@ + 'INTEGER', + 'INT' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'REAL' => 'DOUBLE PRECISION', + 'SMALLFLOAT' => 'DOUBLE PRECISION' + ); + + /** + * DEFAULT value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_default = ', '; + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'CHANGE') + { + $alter_type = 'MODIFY'; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'BYTE': + case 'TEXT': + case 'BLOB': + case 'CLOB': + $attributes['UNIQUE'] = FALSE; + if (isset($attributes['DEFAULT'])) + { + unset($attributes['DEFAULT']); + } + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute UNIQUE + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_unique(&$attributes, &$field) + { + if ( ! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === TRUE) + { + $field['unique'] = ' UNIQUE CONSTRAINT '.$this->db->escape_identifiers($field['name']); + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php new file mode 100644 index 0000000..e172145 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_driver.php @@ -0,0 +1,374 @@ +dsn)) + { + $this->dsn = 'mysql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ';port='.$this->port; + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + } + elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 6) === FALSE) + { + $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + if (isset($this->stricton)) + { + if ($this->stricton) + { + $sql = 'CONCAT(@@sql_mode, ",", "STRICT_ALL_TABLES")'; + } + else + { + $sql = 'REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + "STRICT_ALL_TABLES,", ""), + ",STRICT_ALL_TABLES", ""), + "STRICT_ALL_TABLES", ""), + "STRICT_TRANS_TABLES,", ""), + ",STRICT_TRANS_TABLES", ""), + "STRICT_TRANS_TABLES", "")'; + } + + if ( ! empty($sql)) + { + if (empty($this->options[PDO::MYSQL_ATTR_INIT_COMMAND])) + { + $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET SESSION sql_mode = '.$sql; + } + else + { + $this->options[PDO::MYSQL_ATTR_INIT_COMMAND] .= ', @@session.sql_mode = '.$sql; + } + } + } + + if ($this->compress === TRUE) + { + $this->options[PDO::MYSQL_ATTR_COMPRESS] = TRUE; + } + + if (is_array($this->encrypt)) + { + $ssl = array(); + empty($this->encrypt['ssl_key']) OR $ssl[PDO::MYSQL_ATTR_SSL_KEY] = $this->encrypt['ssl_key']; + empty($this->encrypt['ssl_cert']) OR $ssl[PDO::MYSQL_ATTR_SSL_CERT] = $this->encrypt['ssl_cert']; + empty($this->encrypt['ssl_ca']) OR $ssl[PDO::MYSQL_ATTR_SSL_CA] = $this->encrypt['ssl_ca']; + empty($this->encrypt['ssl_capath']) OR $ssl[PDO::MYSQL_ATTR_SSL_CAPATH] = $this->encrypt['ssl_capath']; + empty($this->encrypt['ssl_cipher']) OR $ssl[PDO::MYSQL_ATTR_SSL_CIPHER] = $this->encrypt['ssl_cipher']; + + // DO NOT use array_merge() here! + // It re-indexes numeric keys and the PDO_MYSQL_ATTR_SSL_* constants are integers. + empty($ssl) OR $this->options += $ssl; + } + + // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails + if ( + ($pdo = parent::db_connect($persistent)) !== FALSE + && ! empty($ssl) + && version_compare($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), '5.7.3', '<=') + && empty($pdo->query("SHOW STATUS LIKE 'ssl_cipher'")->fetchObject()->Value) + ) + { + $message = 'PDO_MYSQL was configured for an SSL connection, but got an unencrypted connection instead!'; + log_message('error', $message); + return ($this->db_debug) ? $this->display_error($message, '', TRUE) : FALSE; + } + + return $pdo; + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + if (FALSE !== $this->simple_query('USE '.$this->escape_identifiers($database))) + { + $this->database = $database; + $this->data_cache = array(); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE); + return $this->conn_id->beginTransaction(); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + if ($this->conn_id->commit()) + { + $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + if ($this->conn_id->rollBack()) + { + $this->conn_id->setAttribute(PDO::ATTR_AUTOCOMMIT, TRUE); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SHOW TABLES'; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql." LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('SHOW COLUMNS FROM '.$this->protect_identifiers($table, TRUE, NULL, FALSE))) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', + $retval[$i]->type, + $retval[$i]->max_length + ); + + $retval[$i]->default = $query[$i]->Default; + $retval[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * @return string + */ + protected function _from_tables() + { + if ( ! empty($this->qb_join) && count($this->qb_from) > 1) + { + return '('.implode(', ', $this->qb_from).')'; + } + + return implode(', ', $this->qb_from); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php new file mode 100644 index 0000000..629e0a9 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_mysql_forge.php @@ -0,0 +1,256 @@ +db->char_set) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) + { + $sql .= ' DEFAULT CHARACTER SET = '.$this->db->char_set; + } + + if ( ! empty($this->db->dbcollat) && ! strpos($sql, 'COLLATE')) + { + $sql .= ' COLLATE = '.$this->db->dbcollat; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP') + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = ($alter_type === 'ADD') + ? "\n\tADD ".$field[$i]['_literal'] + : "\n\tMODIFY ".$field[$i]['_literal']; + } + else + { + if ($alter_type === 'ADD') + { + $field[$i]['_literal'] = "\n\tADD "; + } + else + { + $field[$i]['_literal'] = empty($field[$i]['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; + } + + $field[$i] = $field[$i]['_literal'].$this->_process_column($field[$i]); + } + } + + return array($sql.implode(',', $field)); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + $extra_clause = isset($field['after']) + ? ' AFTER '.$this->db->escape_identifiers($field['after']) : ''; + + if (empty($extra_clause) && isset($field['first']) && $field['first'] === TRUE) + { + $extra_clause = ' FIRST'; + } + + return $this->db->escape_identifiers($field['name']) + .(empty($field['new_name']) ? '' : ' '.$this->db->escape_identifiers($field['new_name'])) + .' '.$field['type'].$field['length'] + .$field['unsigned'] + .$field['null'] + .$field['default'] + .$field['auto_increment'] + .$field['unique'] + .(empty($field['comment']) ? '' : ' COMMENT '.$field['comment']) + .$extra_clause; + } + + // -------------------------------------------------------------------- + + /** + * Process indexes + * + * @param string $table (ignored) + * @return string + */ + protected function _process_indexes($table) + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) + { + if (is_array($this->keys[$i])) + { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) + { + if ( ! isset($this->fields[$this->keys[$i][$i2]])) + { + unset($this->keys[$i][$i2]); + continue; + } + } + } + elseif ( ! isset($this->fields[$this->keys[$i]])) + { + unset($this->keys[$i]); + continue; + } + + is_array($this->keys[$i]) OR $this->keys[$i] = array($this->keys[$i]); + + $sql .= ",\n\tKEY ".$this->db->escape_identifiers(implode('_', $this->keys[$i])) + .' ('.implode(', ', $this->db->escape_identifiers($this->keys[$i])).')'; + } + + $this->keys = array(); + + return $sql; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php new file mode 100644 index 0000000..fef7a9a --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_driver.php @@ -0,0 +1,326 @@ +dsn)) + { + $this->dsn = 'oci:dbname='; + + // Oracle has a slightly different PDO DSN format (Easy Connect), + // which also supports pre-defined DSNs. + if (empty($this->hostname) && empty($this->port)) + { + $this->dsn .= $this->database; + } + else + { + $this->dsn .= '//'.(empty($this->hostname) ? '127.0.0.1' : $this->hostname) + .(empty($this->port) ? '' : ':'.$this->port).'/'; + + empty($this->database) OR $this->dsn .= $this->database; + } + + empty($this->char_set) OR $this->dsn .= ';charset='.$this->char_set; + } + elseif ( ! empty($this->char_set) && strpos($this->dsn, 'charset=', 4) === FALSE) + { + $this->dsn .= ';charset='.$this->char_set; + } + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + $version_string = parent::version(); + if (preg_match('#Release\s(?\d+(?:\.\d+)+)#', $version_string, $match)) + { + return $this->data_cache['version'] = $match[1]; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "TABLE_NAME" FROM "ALL_TABLES"'; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql.' WHERE "TABLE_NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + return 'SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS + WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' + AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (strpos($table, '.') !== FALSE) + { + sscanf($table, '%[^.].%s', $owner, $table); + } + else + { + $owner = $this->username; + } + + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHAR_LENGTH, DATA_PRECISION, DATA_LENGTH, DATA_DEFAULT, NULLABLE + FROM ALL_TAB_COLUMNS + WHERE UPPER(OWNER) = '.$this->escape(strtoupper($owner)).' + AND UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + + $length = ($query[$i]->CHAR_LENGTH > 0) + ? $query[$i]->CHAR_LENGTH : $query[$i]->DATA_PRECISION; + if ($length === NULL) + { + $length = $query[$i]->DATA_LENGTH; + } + $retval[$i]->max_length = $length; + + $default = $query[$i]->DATA_DEFAULT; + if ($default === NULL && $query[$i]->NULLABLE === 'N') + { + $default = ''; + } + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _insert_batch($table, $keys, $values) + { + $keys = implode(', ', $keys); + $sql = "INSERT ALL\n"; + + for ($i = 0, $c = count($values); $i < $c; $i++) + { + $sql .= ' INTO '.$table.' ('.$keys.') VALUES '.$values[$i]."\n"; + } + + return $sql.'SELECT * FROM dual'; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + $this->where('rownum <= ',$this->qb_limit, FALSE); + $this->qb_limit = FALSE; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + if (version_compare($this->version(), '12.1', '>=')) + { + // OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + + return 'SELECT * FROM (SELECT inner_query.*, rownum rnum FROM ('.$sql.') inner_query WHERE rownum < '.($this->qb_offset + $this->qb_limit + 1).')' + .($this->qb_offset ? ' WHERE rnum >= '.($this->qb_offset + 1): ''); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php new file mode 100644 index 0000000..ad26561 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_oci_forge.php @@ -0,0 +1,176 @@ +db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + $field[$i] = "\n\t".$field[$i]['_literal']; + } + else + { + $field[$i]['_literal'] = "\n\t".$this->_process_column($field[$i]); + + if ( ! empty($field[$i]['comment'])) + { + $sqls[] = 'COMMENT ON COLUMN ' + .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) + .' IS '.$field[$i]['comment']; + } + + if ($alter_type === 'MODIFY' && ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + } + } + + $sql .= ' '.$alter_type.' '; + $sql .= (count($field) === 1) + ? $field[0] + : '('.implode(',', $field).')'; + + // RENAME COLUMN must be executed after MODIFY + array_unshift($sqls, $sql); + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + // Not supported - sequences and triggers must be used instead + } + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'INT': + $attributes['TYPE'] = 'NUMBER'; + return; + case 'BIGINT': + $attributes['TYPE'] = 'NUMBER'; + return; + default: return; + } + } +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php new file mode 100644 index 0000000..4890988 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_driver.php @@ -0,0 +1,229 @@ +dsn)) + { + $this->dsn = 'odbc:'; + + // Pre-defined DSN + if (empty($this->hostname) && empty($this->HOSTNAME) && empty($this->port) && empty($this->PORT)) + { + if (isset($this->DSN)) + { + $this->dsn .= 'DSN='.$this->DSN; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DSN='.$this->database; + } + + return; + } + + // If the DSN is not pre-configured - try to build an IBM DB2 connection string + $this->dsn .= 'DRIVER='.(isset($this->DRIVER) ? '{'.$this->DRIVER.'}' : '{IBM DB2 ODBC DRIVER}').';'; + + if (isset($this->DATABASE)) + { + $this->dsn .= 'DATABASE='.$this->DATABASE.';'; + } + elseif ( ! empty($this->database)) + { + $this->dsn .= 'DATABASE='.$this->database.';'; + } + + if (isset($this->HOSTNAME)) + { + $this->dsn .= 'HOSTNAME='.$this->HOSTNAME.';'; + } + else + { + $this->dsn .= 'HOSTNAME='.(empty($this->hostname) ? '127.0.0.1;' : $this->hostname.';'); + } + + if (isset($this->PORT)) + { + $this->dsn .= 'PORT='.$this->port.';'; + } + elseif ( ! empty($this->port)) + { + $this->dsn .= ';PORT='.$this->port.';'; + } + + $this->dsn .= 'PROTOCOL='.(isset($this->PROTOCOL) ? $this->PROTOCOL.';' : 'TCPIP;'); + } + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependent string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + $this->display_error('db_unsupported_feature'); + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = '".$this->schema."'"; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql." AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT column_name FROM information_schema.columns WHERE table_name = '.$this->escape($table); + } +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php new file mode 100644 index 0000000..02b6a2a --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_odbc_forge.php @@ -0,0 +1,70 @@ +dsn)) + { + $this->dsn = 'pgsql:host='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ';port='.$this->port; + empty($this->database) OR $this->dsn .= ';dbname='.$this->database; + + if ( ! empty($this->username)) + { + $this->dsn .= ';username='.$this->username; + empty($this->password) OR $this->dsn .= ';password='.$this->password; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + $this->conn_id = parent::db_connect($persistent); + + if (is_object($this->conn_id) && ! empty($this->schema)) + { + $this->simple_query('SET search_path TO '.$this->schema.',public'); + } + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @param string $name + * @return int + */ + public function insert_id($name = NULL) + { + if ($name === NULL && version_compare($this->version(), '8.1', '>=')) + { + $query = $this->query('SELECT LASTVAL() AS ins_id'); + $query = $query->row(); + return $query->ins_id; + } + + return $this->conn_id->lastInsertId($name); + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + + /** + * "Smart" Escape String + * + * Escapes data based on type + * + * @param string $str + * @return mixed + */ + public function escape($str) + { + if (is_bool($str)) + { + return ($str) ? 'TRUE' : 'FALSE'; + } + + return parent::escape($str); + } + + // -------------------------------------------------------------------- + + /** + * ORDER BY + * + * @param string $orderby + * @param string $direction ASC, DESC or RANDOM + * @param bool $escape + * @return object + */ + public function order_by($orderby, $direction = '', $escape = NULL) + { + $direction = strtoupper(trim($direction)); + if ($direction === 'RANDOM') + { + if ( ! is_float($orderby) && ctype_digit((string) $orderby)) + { + $orderby = ($orderby > 1) + ? (float) '0.'.$orderby + : (float) $orderby; + } + + if (is_float($orderby)) + { + $this->simple_query('SET SEED '.$orderby); + } + + $orderby = $this->_random_keyword[0]; + $direction = ''; + $escape = FALSE; + } + + return parent::order_by($orderby, $direction, $escape); + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql.' AND "table_name" LIKE \'' + .$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT "column_name" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->column_name; + $retval[$i]->type = $query[$i]->data_type; + $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; + $retval[$i]->default = $query[$i]->column_default; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string $table Table name + * @param array $values Update data + * @param string $index WHERE key + * @return string + */ + protected function _update_batch($table, $values, $index) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]['value']; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k.' = (CASE '.$val[$index]['field']."\n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END), '; + } + + $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php new file mode 100644 index 0000000..e5bfee6 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_pgsql_forge.php @@ -0,0 +1,210 @@ + 'INTEGER', + 'SMALLINT' => 'INTEGER', + 'INT' => 'BIGINT', + 'INT4' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'INT8' => 'NUMERIC', + 'BIGINT' => 'NUMERIC', + 'REAL' => 'DOUBLE PRECISION', + 'FLOAT' => 'DOUBLE PRECISION' + ); + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_null = 'NULL'; + + // -------------------------------------------------------------------- + + /** + * Class constructor + * + * @param object &$db Database object + * @return void + */ + public function __construct(&$db) + { + parent::__construct($db); + + if (version_compare($this->db->version(), '9.0', '>')) + { + $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; + } + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + return FALSE; + } + + if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TYPE '.$field[$i]['type'].$field[$i]['length']; + } + + if ( ! empty($field[$i]['default'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' SET DEFAULT '.$field[$i]['default']; + } + + if (isset($field[$i]['null'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL'); + } + + if ( ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + + if ( ! empty($field[$i]['comment'])) + { + $sqls[] = 'COMMENT ON COLUMN ' + .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) + .' IS '.$field[$i]['comment']; + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + // Reset field lengths for data types that don't support it + if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) + { + $attributes['CONSTRAINT'] = NULL; + } + + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $field['type'] = ($field['type'] === 'NUMERIC') + ? 'BIGSERIAL' + : 'SERIAL'; + } + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php new file mode 100644 index 0000000..93871a9 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_driver.php @@ -0,0 +1,219 @@ +dsn)) + { + $this->dsn = 'sqlite:'; + + if (empty($this->database) && empty($this->hostname)) + { + $this->database = ':memory:'; + } + + $this->database = empty($this->database) ? $this->hostname : $this->database; + } + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\''; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + return $sql.' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * @param string $table Table name + * @return array + */ + public function list_fields($table) + { + // Is there a cached result? + if (isset($this->data_cache['field_names'][$table])) + { + return $this->data_cache['field_names'][$table]; + } + + if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $this->data_cache['field_names'][$table] = array(); + foreach ($result->result_array() as $row) + { + $this->data_cache['field_names'][$table][] = $row['name']; + } + + return $this->data_cache['field_names'][$table]; + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $query = $query->result_array(); + if (empty($query)) + { + return FALSE; + } + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]['name']; + $retval[$i]->type = $query[$i]['type']; + $retval[$i]->max_length = NULL; + $retval[$i]->default = $query[$i]['dflt_value']; + $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Replace statement + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _replace($table, $keys, $values) + { + return 'INSERT OR '.parent::_replace($table, $keys, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php new file mode 100644 index 0000000..67fe6ee --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlite_forge.php @@ -0,0 +1,238 @@ +db->version(), '3.3', '<')) + { + $this->_create_table_if = FALSE; + $this->_drop_table_if = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name (ignored) + * @return bool + */ + public function create_database($db_name) + { + // In SQLite, a database is created when you connect to the database. + // We'll return TRUE so that an error isn't generated + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name (ignored) + * @return bool + */ + public function drop_database($db_name) + { + // In SQLite, a database is dropped when we delete a file + if (file_exists($this->db->database)) + { + // We need to close the pseudo-connection first + $this->db->close(); + if ( ! @unlink($this->db->database)) + { + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') + { + // drop_column(): + // BEGIN TRANSACTION; + // CREATE TEMPORARY TABLE t1_backup(a,b); + // INSERT INTO t1_backup SELECT a,b FROM t1; + // DROP TABLE t1; + // CREATE TABLE t1(a,b); + // INSERT INTO t1 SELECT a,b FROM t1_backup; + // DROP TABLE t1_backup; + // COMMIT; + + return FALSE; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'] + .$field['auto_increment'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'ENUM': + case 'SET': + $attributes['TYPE'] = 'TEXT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['type'] = 'INTEGER PRIMARY KEY'; + $field['default'] = ''; + $field['null'] = ''; + $field['unique'] = ''; + $field['auto_increment'] = ' AUTOINCREMENT'; + + $this->primary_keys = array(); + } + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php new file mode 100644 index 0000000..db10029 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_driver.php @@ -0,0 +1,369 @@ +dsn)) + { + $this->dsn = 'sqlsrv:Server='.(empty($this->hostname) ? '127.0.0.1' : $this->hostname); + + empty($this->port) OR $this->dsn .= ','.$this->port; + empty($this->database) OR $this->dsn .= ';Database='.$this->database; + + // Some custom options + + if (isset($this->QuotedId)) + { + $this->dsn .= ';QuotedId='.$this->QuotedId; + $this->_quoted_identifier = (bool) $this->QuotedId; + } + + if (isset($this->ConnectionPooling)) + { + $this->dsn .= ';ConnectionPooling='.$this->ConnectionPooling; + } + + if ($this->encrypt === TRUE) + { + $this->dsn .= ';Encrypt=1'; + } + + if (isset($this->TraceOn)) + { + $this->dsn .= ';TraceOn='.$this->TraceOn; + } + + if (isset($this->TrustServerCertificate)) + { + $this->dsn .= ';TrustServerCertificate='.$this->TrustServerCertificate; + } + + empty($this->APP) OR $this->dsn .= ';APP='.$this->APP; + empty($this->Failover_Partner) OR $this->dsn .= ';Failover_Partner='.$this->Failover_Partner; + empty($this->LoginTimeout) OR $this->dsn .= ';LoginTimeout='.$this->LoginTimeout; + empty($this->MultipleActiveResultSets) OR $this->dsn .= ';MultipleActiveResultSets='.$this->MultipleActiveResultSets; + empty($this->TraceFile) OR $this->dsn .= ';TraceFile='.$this->TraceFile; + empty($this->WSID) OR $this->dsn .= ';WSID='.$this->WSID; + } + elseif (preg_match('/QuotedId=(0|1)/', $this->dsn, $match)) + { + $this->_quoted_identifier = (bool) $match[1]; + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return object + */ + public function db_connect($persistent = FALSE) + { + if ( ! empty($this->char_set) && preg_match('/utf[^8]*8/i', $this->char_set)) + { + $this->options[PDO::SQLSRV_ENCODING_UTF8] = 1; + } + + $this->conn_id = parent::db_connect($persistent); + + if ( ! is_object($this->conn_id) OR is_bool($this->_quoted_identifier)) + { + return $this->conn_id; + } + + // Determine how identifiers are escaped + $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); + $query = $query->row_array(); + $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; + $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('name') + .' FROM '.$this->escape_identifiers('sysobjects') + .' WHERE '.$this->escape_identifiers('type')." = 'U'"; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql.' ORDER BY '.$this->escape_identifiers('name'); + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + // As of SQL Server 2012 (11.0.*) OFFSET is supported + if (version_compare($this->version(), '11', '>=')) + { + // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + + $limit = $this->qb_offset + $this->qb_limit; + + // An ORDER BY clause is required for ROW_NUMBER() to work + if ($this->qb_offset && ! empty($this->qb_orderby)) + { + $orderby = $this->_compile_order_by(); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); + + // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results + if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) + { + $select = '*'; // Inevitable + } + else + { + // Use only field names and their aliases, everything else is out of our scope. + $select = array(); + $field_regexp = ($this->_quoted_identifier) + ? '("[^\"]+")' : '(\[[^\]]+\])'; + for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) + { + $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) + ? $m[1] : $this->qb_select[$i]; + } + $select = implode(', ', $select); + } + + return 'SELECT '.$select." FROM (\n\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + // Multiple-value inserts are only supported as of SQL Server 2008 + if (version_compare($this->version(), '10', '>=')) + { + return parent::_insert_batch($table, $keys, $values); + } + + return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; + } + +} diff --git a/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php new file mode 100644 index 0000000..4c9dbe6 --- /dev/null +++ b/system/database/drivers/pdo/subdrivers/pdo_sqlsrv_forge.php @@ -0,0 +1,149 @@ + 'SMALLINT', + 'SMALLINT' => 'INT', + 'INT' => 'BIGINT', + 'REAL' => 'FLOAT' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql.$this->_process_column($field[$i]); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) + { + unset($attributes['CONSTRAINT']); + } + + switch (strtoupper($attributes['TYPE'])) + { + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' IDENTITY(1,1)'; + } + } + +} diff --git a/system/database/drivers/postgre/index.html b/system/database/drivers/postgre/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/postgre/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php new file mode 100644 index 0000000..5779c87 --- /dev/null +++ b/system/database/drivers/postgre/postgre_driver.php @@ -0,0 +1,619 @@ +dsn)) + { + return; + } + + $this->dsn === '' OR $this->dsn = ''; + + if (strpos($this->hostname, '/') !== FALSE) + { + // If UNIX sockets are used, we shouldn't set a port + $this->port = ''; + } + + $this->hostname === '' OR $this->dsn = 'host='.$this->hostname.' '; + + if ( ! empty($this->port) && ctype_digit($this->port)) + { + $this->dsn .= 'port='.$this->port.' '; + } + + if ($this->username !== '') + { + $this->dsn .= 'user='.$this->username.' '; + + /* An empty password is valid! + * + * $db['password'] = NULL must be done in order to ignore it. + */ + $this->password === NULL OR $this->dsn .= "password='".$this->password."' "; + } + + $this->database === '' OR $this->dsn .= 'dbname='.$this->database.' '; + + /* We don't have these options as elements in our standard configuration + * array, but they might be set by parse_url() if the configuration was + * provided via string. Example: + * + * postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1 + */ + foreach (array('connect_timeout', 'options', 'sslmode', 'service') as $key) + { + if (isset($this->$key) && is_string($this->$key) && $this->$key !== '') + { + $this->dsn .= $key."='".$this->$key."' "; + } + } + + $this->dsn = rtrim($this->dsn); + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $persistent + * @return resource + */ + public function db_connect($persistent = FALSE) + { + $this->conn_id = ($persistent === TRUE) + ? pg_pconnect($this->dsn) + : pg_connect($this->dsn); + + if ($this->conn_id !== FALSE) + { + if ($persistent === TRUE + && pg_connection_status($this->conn_id) === PGSQL_CONNECTION_BAD + && pg_ping($this->conn_id) === FALSE + ) + { + return FALSE; + } + + empty($this->schema) OR $this->simple_query('SET search_path TO '.$this->schema.',public'); + } + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @return void + */ + public function reconnect() + { + if (pg_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @param string $charset + * @return bool + */ + protected function _db_set_charset($charset) + { + return (pg_set_client_encoding($this->conn_id, $charset) === 0); + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if ( ! $this->conn_id OR ($pg_version = pg_version($this->conn_id)) === FALSE) + { + return FALSE; + } + + /* If PHP was compiled with PostgreSQL lib versions earlier + * than 7.4, pg_version() won't return the server version + * and so we'll have to fall back to running a query in + * order to get it. + */ + return (isset($pg_version['server']) && preg_match('#^(\d+\.\d+)#', $pg_version['server'], $match)) + ? $this->data_cache['version'] = $match[1] + : parent::version(); + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return pg_query($this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return (bool) pg_query($this->conn_id, 'BEGIN'); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return (bool) pg_query($this->conn_id, 'COMMIT'); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return (bool) pg_query($this->conn_id, 'ROLLBACK'); + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @param string An SQL query string + * @return bool + */ + public function is_write_type($sql) + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) + { + return FALSE; + } + + return parent::is_write_type($sql); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependent string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return pg_escape_string($this->conn_id, $str); + } + + // -------------------------------------------------------------------- + + /** + * "Smart" Escape String + * + * Escapes data based on type + * + * @param string $str + * @return mixed + */ + public function escape($str) + { + if (is_php('5.4.4') && (is_string($str) OR (is_object($str) && method_exists($str, '__toString')))) + { + return pg_escape_literal($this->conn_id, $str); + } + elseif (is_bool($str)) + { + return ($str) ? 'TRUE' : 'FALSE'; + } + + return parent::escape($str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return pg_affected_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return string + */ + public function insert_id() + { + $v = $this->version(); + + $table = (func_num_args() > 0) ? func_get_arg(0) : NULL; + $column = (func_num_args() > 1) ? func_get_arg(1) : NULL; + + if ($table === NULL && $v >= '8.1') + { + $sql = 'SELECT LASTVAL() AS ins_id'; + } + elseif ($table !== NULL) + { + if ($column !== NULL && $v >= '8.0') + { + $sql = 'SELECT pg_get_serial_sequence(\''.$table."', '".$column."') AS seq"; + $query = $this->query($sql); + $query = $query->row(); + $seq = $query->seq; + } + else + { + // seq_name passed in table parameter + $seq = $table; + } + + $sql = 'SELECT CURRVAL(\''.$seq."') AS ins_id"; + } + else + { + return pg_last_oid($this->result_id); + } + + $query = $this->query($sql); + $query = $query->row(); + return (int) $query->ins_id; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \''.$this->schema."'"; + + if ($prefix_limit !== FALSE && $this->dbprefix !== '') + { + return $sql.' AND "table_name" LIKE \'' + .$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT "column_name" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = '.$this->escape(strtolower($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->column_name; + $retval[$i]->type = $query[$i]->data_type; + $retval[$i]->max_length = ($query[$i]->character_maximum_length > 0) ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; + $retval[$i]->default = $query[$i]->column_default; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + return array('code' => '', 'message' => pg_last_error($this->conn_id)); + } + + // -------------------------------------------------------------------- + + /** + * ORDER BY + * + * @param string $orderby + * @param string $direction ASC, DESC or RANDOM + * @param bool $escape + * @return object + */ + public function order_by($orderby, $direction = '', $escape = NULL) + { + $direction = strtoupper(trim($direction)); + if ($direction === 'RANDOM') + { + if ( ! is_float($orderby) && ctype_digit((string) $orderby)) + { + $orderby = ($orderby > 1) + ? (float) '0.'.$orderby + : (float) $orderby; + } + + if (is_float($orderby)) + { + $this->simple_query('SET SEED '.$orderby); + } + + $orderby = $this->_random_keyword[0]; + $direction = ''; + $escape = FALSE; + } + + return parent::order_by($orderby, $direction, $escape); + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @param string $table Table name + * @param array $values Update data + * @param string $index WHERE key + * @return string + */ + protected function _update_batch($table, $values, $index) + { + $ids = array(); + foreach ($values as $key => $val) + { + $ids[] = $val[$index]['value']; + + foreach (array_keys($val) as $field) + { + if ($field !== $index) + { + $final[$val[$field]['field']][] = 'WHEN '.$val[$index]['value'].' THEN '.$val[$field]['value']; + } + } + } + + $cases = ''; + foreach ($final as $k => $v) + { + $cases .= $k.' = (CASE '.$val[$index]['field']."\n" + .implode("\n", $v)."\n" + .'ELSE '.$k.' END), '; + } + + $this->where($val[$index]['field'].' IN('.implode(',', $ids).')', NULL, FALSE); + + return 'UPDATE '.$table.' SET '.substr($cases, 0, -2).$this->_compile_wh('qb_where'); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + $this->qb_limit = FALSE; + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + return $sql.' LIMIT '.$this->qb_limit.($this->qb_offset ? ' OFFSET '.$this->qb_offset : ''); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + pg_close($this->conn_id); + } + +} diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php new file mode 100644 index 0000000..cf90325 --- /dev/null +++ b/system/database/drivers/postgre/postgre_forge.php @@ -0,0 +1,205 @@ + 'INTEGER', + 'SMALLINT' => 'INTEGER', + 'INT' => 'BIGINT', + 'INT4' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'INT8' => 'NUMERIC', + 'BIGINT' => 'NUMERIC', + 'REAL' => 'DOUBLE PRECISION', + 'FLOAT' => 'DOUBLE PRECISION' + ); + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + */ + protected $_null = 'NULL'; + + // -------------------------------------------------------------------- + + /** + * Class constructor + * + * @param object &$db Database object + * @return void + */ + public function __construct(&$db) + { + parent::__construct($db); + + if (version_compare($this->db->version(), '9.0', '>')) + { + $this->create_table_if = 'CREATE TABLE IF NOT EXISTS'; + } + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('DROP', 'ADD'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table); + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + if ($field[$i]['_literal'] !== FALSE) + { + return FALSE; + } + + if (version_compare($this->db->version(), '8', '>=') && isset($field[$i]['type'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TYPE '.$field[$i]['type'].$field[$i]['length']; + } + + if ( ! empty($field[$i]['default'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' SET DEFAULT '.$field[$i]['default']; + } + + if (isset($field[$i]['null'])) + { + $sqls[] = $sql.' ALTER COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .($field[$i]['null'] === TRUE ? ' DROP NOT NULL' : ' SET NOT NULL'); + } + + if ( ! empty($field[$i]['new_name'])) + { + $sqls[] = $sql.' RENAME COLUMN '.$this->db->escape_identifiers($field[$i]['name']) + .' TO '.$this->db->escape_identifiers($field[$i]['new_name']); + } + + if ( ! empty($field[$i]['comment'])) + { + $sqls[] = 'COMMENT ON COLUMN ' + .$this->db->escape_identifiers($table).'.'.$this->db->escape_identifiers($field[$i]['name']) + .' IS '.$field[$i]['comment']; + } + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + // Reset field lengths for data types that don't support it + if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== FALSE) + { + $attributes['CONSTRAINT'] = NULL; + } + + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $field['type'] = ($field['type'] === 'NUMERIC') + ? 'BIGSERIAL' + : 'SERIAL'; + } + } + +} diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php new file mode 100644 index 0000000..daf3306 --- /dev/null +++ b/system/database/drivers/postgre/postgre_result.php @@ -0,0 +1,182 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = pg_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return pg_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field_names[] = pg_field_name($this->result_id, $i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = pg_field_name($this->result_id, $i); + $retval[$i]->type = pg_field_type($this->result_id, $i); + $retval[$i]->max_length = pg_field_size($this->result_id, $i); + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + pg_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return pg_result_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return pg_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return pg_fetch_object($this->result_id, NULL, $class_name); + } + +} diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php new file mode 100644 index 0000000..3af225f --- /dev/null +++ b/system/database/drivers/postgre/postgre_utility.php @@ -0,0 +1,78 @@ +db->display_error('db_unsupported_feature'); + } +} diff --git a/system/database/drivers/sqlite/index.html b/system/database/drivers/sqlite/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/sqlite/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php new file mode 100644 index 0000000..a061229 --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -0,0 +1,330 @@ +database, 0666, $error) + : sqlite_open($this->database, 0666, $error); + + isset($error) && log_message('error', $error); + + return $conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + return isset($this->data_cache['version']) + ? $this->data_cache['version'] + : $this->data_cache['version'] = sqlite_libversion(); + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return $this->is_write_type($sql) + ? sqlite_exec($this->conn_id, $sql) + : sqlite_query($this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return $this->simple_query('BEGIN TRANSACTION'); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return $this->simple_query('COMMIT'); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return $this->simple_query('ROLLBACK'); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependant string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return sqlite_escape_string($str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return sqlite_changes($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return sqlite_last_insert_rowid($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT name FROM sqlite_master WHERE type='table'"; + + if ($prefix_limit !== FALSE && $this->dbprefix != '') + { + return $sql." AND 'name' LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return bool + */ + protected function _list_columns($table = '') + { + // Not supported + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $query = $query->result_array(); + if (empty($query)) + { + return FALSE; + } + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]['name']; + $retval[$i]->type = $query[$i]['type']; + $retval[$i]->max_length = NULL; + $retval[$i]->default = $query[$i]['dflt_value']; + $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occured. + * + * @return array + */ + public function error() + { + $error = array('code' => sqlite_last_error($this->conn_id)); + $error['message'] = sqlite_error_string($error['code']); + return $error; + } + + // -------------------------------------------------------------------- + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _replace($table, $keys, $values) + { + return 'INSERT OR '.parent::_replace($table, $keys, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this function maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + sqlite_close($this->conn_id); + } + +} diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php new file mode 100644 index 0000000..10d5fe6 --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -0,0 +1,205 @@ +db->database) OR ! @unlink($this->db->database)) + { + return ($this->db->db_debug) ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @todo implement drop_column(), modify_column() + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') + { + // drop_column(): + // BEGIN TRANSACTION; + // CREATE TEMPORARY TABLE t1_backup(a,b); + // INSERT INTO t1_backup SELECT a,b FROM t1; + // DROP TABLE t1; + // CREATE TABLE t1(a,b); + // INSERT INTO t1 SELECT a,b FROM t1_backup; + // DROP TABLE t1_backup; + // COMMIT; + + return FALSE; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'] + .$field['auto_increment'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'ENUM': + case 'SET': + $attributes['TYPE'] = 'TEXT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['type'] = 'INTEGER PRIMARY KEY'; + $field['default'] = ''; + $field['null'] = ''; + $field['unique'] = ''; + $field['auto_increment'] = ' AUTOINCREMENT'; + + $this->primary_keys = array(); + } + } + +} diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php new file mode 100644 index 0000000..59516b0 --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_result.php @@ -0,0 +1,164 @@ +num_rows) + ? $this->num_rows + : $this->num_rows = @sqlite_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return @sqlite_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field_names[$i] = sqlite_field_name($this->result_id, $i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = sqlite_field_name($this->result_id, $i); + $retval[$i]->type = NULL; + $retval[$i]->max_length = NULL; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n + * @return bool + */ + public function data_seek($n = 0) + { + return sqlite_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return sqlite_fetch_array($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return sqlite_fetch_object($this->result_id, $class_name); + } + +} diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php new file mode 100644 index 0000000..57f685e --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_utility.php @@ -0,0 +1,61 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/sqlite3/index.html b/system/database/drivers/sqlite3/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/sqlite3/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/sqlite3/sqlite3_driver.php b/system/database/drivers/sqlite3/sqlite3_driver.php new file mode 100644 index 0000000..41d9d48 --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_driver.php @@ -0,0 +1,350 @@ +password) + ? new SQLite3($this->database) + : new SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password); + } + catch (Exception $e) + { + return FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + $version = SQLite3::version(); + return $this->data_cache['version'] = $version['versionString']; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @todo Implement use of SQLite3::querySingle(), if needed + * @param string $sql + * @return mixed SQLite3Result object or bool + */ + protected function _execute($sql) + { + return $this->is_write_type($sql) + ? $this->conn_id->exec($sql) + : $this->conn_id->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return $this->conn_id->exec('BEGIN TRANSACTION'); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return $this->conn_id->exec('END TRANSACTION'); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return $this->conn_id->exec('ROLLBACK'); + } + + // -------------------------------------------------------------------- + + /** + * Platform-dependent string escape + * + * @param string + * @return string + */ + protected function _escape_str($str) + { + return $this->conn_id->escapeString($str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return $this->conn_id->changes(); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @return int + */ + public function insert_id() + { + return $this->conn_id->lastInsertRowID(); + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool $prefix_limit + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\'' + .(($prefix_limit !== FALSE && $this->dbprefix != '') + ? ' AND "NAME" LIKE \''.$this->escape_like_str($this->dbprefix).'%\' '.sprintf($this->_like_escape_str, $this->_like_escape_chr) + : ''); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * @param string $table Table name + * @return array + */ + public function list_fields($table) + { + // Is there a cached result? + if (isset($this->data_cache['field_names'][$table])) + { + return $this->data_cache['field_names'][$table]; + } + + if (($result = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $this->data_cache['field_names'][$table] = array(); + foreach ($result->result_array() as $row) + { + $this->data_cache['field_names'][$table][] = $row['name']; + } + + return $this->data_cache['field_names'][$table]; + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + if (($query = $this->query('PRAGMA TABLE_INFO('.$this->protect_identifiers($table, TRUE, NULL, FALSE).')')) === FALSE) + { + return FALSE; + } + + $query = $query->result_array(); + if (empty($query)) + { + return FALSE; + } + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]['name']; + $retval[$i]->type = $query[$i]['type']; + $retval[$i]->max_length = NULL; + $retval[$i]->default = $query[$i]['dflt_value']; + $retval[$i]->primary_key = isset($query[$i]['pk']) ? (int) $query[$i]['pk'] : 0; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + return array('code' => $this->conn_id->lastErrorCode(), 'message' => $this->conn_id->lastErrorMsg()); + } + + // -------------------------------------------------------------------- + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string + */ + protected function _replace($table, $keys, $values) + { + return 'INSERT OR '.parent::_replace($table, $keys, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'DELETE FROM '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + $this->conn_id->close(); + } + +} diff --git a/system/database/drivers/sqlite3/sqlite3_forge.php b/system/database/drivers/sqlite3/sqlite3_forge.php new file mode 100644 index 0000000..48c5efc --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_forge.php @@ -0,0 +1,225 @@ +db->version(), '3.3', '<')) + { + $this->_create_table_if = FALSE; + $this->_drop_table_if = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @param string $db_name + * @return bool + */ + public function create_database($db_name) + { + // In SQLite, a database is created when you connect to the database. + // We'll return TRUE so that an error isn't generated + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @param string $db_name (ignored) + * @return bool + */ + public function drop_database($db_name) + { + // In SQLite, a database is dropped when we delete a file + if (file_exists($this->db->database)) + { + // We need to close the pseudo-connection first + $this->db->close(); + if ( ! @unlink($this->db->database)) + { + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + elseif ( ! empty($this->db->data_cache['db_names'])) + { + $key = array_search(strtolower($this->db->database), array_map('strtolower', $this->db->data_cache['db_names']), TRUE); + if ($key !== FALSE) + { + unset($this->db->data_cache['db_names'][$key]); + } + } + + return TRUE; + } + + return $this->db->db_debug ? $this->db->display_error('db_unable_to_drop') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @todo implement drop_column(), modify_column() + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if ($alter_type === 'DROP' OR $alter_type === 'CHANGE') + { + // drop_column(): + // BEGIN TRANSACTION; + // CREATE TEMPORARY TABLE t1_backup(a,b); + // INSERT INTO t1_backup SELECT a,b FROM t1; + // DROP TABLE t1; + // CREATE TABLE t1(a,b); + // INSERT INTO t1 SELECT a,b FROM t1_backup; + // DROP TABLE t1_backup; + // COMMIT; + + return FALSE; + } + + return parent::_alter_table($alter_type, $table, $field); + } + + // -------------------------------------------------------------------- + + /** + * Process column + * + * @param array $field + * @return string + */ + protected function _process_column($field) + { + return $this->db->escape_identifiers($field['name']) + .' '.$field['type'] + .$field['auto_increment'] + .$field['null'] + .$field['unique'] + .$field['default']; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + switch (strtoupper($attributes['TYPE'])) + { + case 'ENUM': + case 'SET': + $attributes['TYPE'] = 'TEXT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['type'] = 'INTEGER PRIMARY KEY'; + $field['default'] = ''; + $field['null'] = ''; + $field['unique'] = ''; + $field['auto_increment'] = ' AUTOINCREMENT'; + + $this->primary_keys = array(); + } + } + +} diff --git a/system/database/drivers/sqlite3/sqlite3_result.php b/system/database/drivers/sqlite3/sqlite3_result.php new file mode 100644 index 0000000..a143fd7 --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_result.php @@ -0,0 +1,194 @@ +result_id->numColumns(); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $field_names[] = $this->result_id->columnName($i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + static $data_types = array( + SQLITE3_INTEGER => 'integer', + SQLITE3_FLOAT => 'float', + SQLITE3_TEXT => 'text', + SQLITE3_BLOB => 'blob', + SQLITE3_NULL => 'null' + ); + + $retval = array(); + for ($i = 0, $c = $this->num_fields(); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $this->result_id->columnName($i); + + $type = $this->result_id->columnType($i); + $retval[$i]->type = isset($data_types[$type]) ? $data_types[$type] : $type; + + $retval[$i]->max_length = NULL; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_object($this->result_id)) + { + $this->result_id->finalize(); + $this->result_id = NULL; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return $this->result_id->fetchArray(SQLITE3_ASSOC); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + // No native support for fetching rows as objects + if (($row = $this->result_id->fetchArray(SQLITE3_ASSOC)) === FALSE) + { + return FALSE; + } + elseif ($class_name === 'stdClass') + { + return (object) $row; + } + + $class_name = new $class_name(); + foreach (array_keys($row) as $key) + { + $class_name->$key = $row[$key]; + } + + return $class_name; + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero. + * + * @param int $n (ignored) + * @return array + */ + public function data_seek($n = 0) + { + // Only resetting to the start of the result set is supported + return ($n > 0) ? FALSE : $this->result_id->reset(); + } + +} diff --git a/system/database/drivers/sqlite3/sqlite3_utility.php b/system/database/drivers/sqlite3/sqlite3_utility.php new file mode 100644 index 0000000..c829c1f --- /dev/null +++ b/system/database/drivers/sqlite3/sqlite3_utility.php @@ -0,0 +1,61 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/drivers/sqlsrv/index.html b/system/database/drivers/sqlsrv/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/drivers/sqlsrv/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php new file mode 100644 index 0000000..05d35a4 --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -0,0 +1,543 @@ +scrollable === NULL) + { + $this->scrollable = defined('SQLSRV_CURSOR_CLIENT_BUFFERED') + ? SQLSRV_CURSOR_CLIENT_BUFFERED + : FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Database connection + * + * @param bool $pooling + * @return resource + */ + public function db_connect($pooling = FALSE) + { + $charset = in_array(strtolower($this->char_set), array('utf-8', 'utf8'), TRUE) + ? 'UTF-8' : SQLSRV_ENC_CHAR; + + $connection = array( + 'UID' => empty($this->username) ? '' : $this->username, + 'PWD' => empty($this->password) ? '' : $this->password, + 'Database' => $this->database, + 'ConnectionPooling' => ($pooling === TRUE) ? 1 : 0, + 'CharacterSet' => $charset, + 'Encrypt' => ($this->encrypt === TRUE) ? 1 : 0, + 'ReturnDatesAsStrings' => 1 + ); + + // If the username and password are both empty, assume this is a + // 'Windows Authentication Mode' connection. + if (empty($connection['UID']) && empty($connection['PWD'])) + { + unset($connection['UID'], $connection['PWD']); + } + + if (FALSE !== ($this->conn_id = sqlsrv_connect($this->hostname, $connection))) + { + // Determine how identifiers are escaped + $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); + $query = $query->row_array(); + $this->_quoted_identifier = empty($query) ? FALSE : (bool) $query['qi']; + $this->_escape_char = ($this->_quoted_identifier) ? '"' : array('[', ']'); + } + + return $this->conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @param string $database + * @return bool + */ + public function db_select($database = '') + { + if ($database === '') + { + $database = $this->database; + } + + if ($this->_execute('USE '.$this->escape_identifiers($database))) + { + $this->database = $database; + $this->data_cache = array(); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @param string $sql an SQL query + * @return resource + */ + protected function _execute($sql) + { + return ($this->scrollable === FALSE OR $this->is_write_type($sql)) + ? sqlsrv_query($this->conn_id, $sql) + : sqlsrv_query($this->conn_id, $sql, NULL, array('Scrollable' => $this->scrollable)); + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @return bool + */ + protected function _trans_begin() + { + return sqlsrv_begin_transaction($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @return bool + */ + protected function _trans_commit() + { + return sqlsrv_commit($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @return bool + */ + protected function _trans_rollback() + { + return sqlsrv_rollback($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @return int + */ + public function affected_rows() + { + return sqlsrv_rows_affected($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * Returns the last id created in the Identity column. + * + * @return string + */ + public function insert_id() + { + return $this->query('SELECT SCOPE_IDENTITY() AS insert_id')->row()->insert_id; + } + + // -------------------------------------------------------------------- + + /** + * Database version number + * + * @return string + */ + public function version() + { + if (isset($this->data_cache['version'])) + { + return $this->data_cache['version']; + } + + if ( ! $this->conn_id OR ($info = sqlsrv_server_info($this->conn_id)) === FALSE) + { + return FALSE; + } + + return $this->data_cache['version'] = $info['SQLServerVersion']; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @param bool + * @return string $prefix_limit + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = 'SELECT '.$this->escape_identifiers('name') + .' FROM '.$this->escape_identifiers('sysobjects') + .' WHERE '.$this->escape_identifiers('type')." = 'U'"; + + if ($prefix_limit === TRUE && $this->dbprefix !== '') + { + $sql .= ' AND '.$this->escape_identifiers('name')." LIKE '".$this->escape_like_str($this->dbprefix)."%' " + .sprintf($this->_escape_like_str, $this->_escape_like_chr); + } + + return $sql.' ORDER BY '.$this->escape_identifiers('name'); + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @param string $table + * @return string + */ + protected function _list_columns($table = '') + { + return 'SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @param string $table + * @return array + */ + public function field_data($table) + { + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.Columns + WHERE UPPER(TABLE_NAME) = '.$this->escape(strtoupper($table)); + + if (($query = $this->query($sql)) === FALSE) + { + return FALSE; + } + $query = $query->result_object(); + + $retval = array(); + for ($i = 0, $c = count($query); $i < $c; $i++) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $query[$i]->COLUMN_NAME; + $retval[$i]->type = $query[$i]->DATA_TYPE; + $retval[$i]->max_length = ($query[$i]->CHARACTER_MAXIMUM_LENGTH > 0) ? $query[$i]->CHARACTER_MAXIMUM_LENGTH : $query[$i]->NUMERIC_PRECISION; + $retval[$i]->default = $query[$i]->COLUMN_DEFAULT; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Returns an array containing code and message of the last + * database error that has occurred. + * + * @return array + */ + public function error() + { + $error = array('code' => '00000', 'message' => ''); + $sqlsrv_errors = sqlsrv_errors(SQLSRV_ERR_ERRORS); + + if ( ! is_array($sqlsrv_errors)) + { + return $error; + } + + $sqlsrv_error = array_shift($sqlsrv_errors); + if (isset($sqlsrv_error['SQLSTATE'])) + { + $error['code'] = isset($sqlsrv_error['code']) ? $sqlsrv_error['SQLSTATE'].'/'.$sqlsrv_error['code'] : $sqlsrv_error['SQLSTATE']; + } + elseif (isset($sqlsrv_error['code'])) + { + $error['code'] = $sqlsrv_error['code']; + } + + if (isset($sqlsrv_error['message'])) + { + $error['message'] = $sqlsrv_error['message']; + } + + return $error; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @param string $table + * @param array $values + * @return string + */ + protected function _update($table, $values) + { + $this->qb_limit = FALSE; + $this->qb_orderby = array(); + return parent::_update($table, $values); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + * + * @param string $table + * @return string + */ + protected function _truncate($table) + { + return 'TRUNCATE TABLE '.$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @param string $table + * @return string + */ + protected function _delete($table) + { + if ($this->qb_limit) + { + return 'WITH ci_delete AS (SELECT TOP '.$this->qb_limit.' * FROM '.$table.$this->_compile_wh('qb_where').') DELETE FROM ci_delete'; + } + + return parent::_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * LIMIT + * + * Generates a platform-specific LIMIT clause + * + * @param string $sql SQL Query + * @return string + */ + protected function _limit($sql) + { + // As of SQL Server 2012 (11.0.*) OFFSET is supported + if (version_compare($this->version(), '11', '>=')) + { + // SQL Server OFFSET-FETCH can be used only with the ORDER BY clause + empty($this->qb_orderby) && $sql .= ' ORDER BY 1'; + + return $sql.' OFFSET '.(int) $this->qb_offset.' ROWS FETCH NEXT '.$this->qb_limit.' ROWS ONLY'; + } + + $limit = $this->qb_offset + $this->qb_limit; + + // An ORDER BY clause is required for ROW_NUMBER() to work + if ($this->qb_offset && ! empty($this->qb_orderby)) + { + $orderby = $this->_compile_order_by(); + + // We have to strip the ORDER BY clause + $sql = trim(substr($sql, 0, strrpos($sql, $orderby))); + + // Get the fields to select from our subquery, so that we can avoid CI_rownum appearing in the actual results + if (count($this->qb_select) === 0 OR strpos(implode(',', $this->qb_select), '*') !== FALSE) + { + $select = '*'; // Inevitable + } + else + { + // Use only field names and their aliases, everything else is out of our scope. + $select = array(); + $field_regexp = ($this->_quoted_identifier) + ? '("[^\"]+")' : '(\[[^\]]+\])'; + for ($i = 0, $c = count($this->qb_select); $i < $c; $i++) + { + $select[] = preg_match('/(?:\s|\.)'.$field_regexp.'$/i', $this->qb_select[$i], $m) + ? $m[1] : $this->qb_select[$i]; + } + $select = implode(', ', $select); + } + + return 'SELECT '.$select." FROM (\n\n" + .preg_replace('/^(SELECT( DISTINCT)?)/i', '\\1 ROW_NUMBER() OVER('.trim($orderby).') AS '.$this->escape_identifiers('CI_rownum').', ', $sql) + ."\n\n) ".$this->escape_identifiers('CI_subquery') + ."\nWHERE ".$this->escape_identifiers('CI_rownum').' BETWEEN '.($this->qb_offset + 1).' AND '.$limit; + } + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$limit.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + * + * @param string $table Table name + * @param array $keys INSERT keys + * @param array $values INSERT values + * @return string|bool + */ + protected function _insert_batch($table, $keys, $values) + { + // Multiple-value inserts are only supported as of SQL Server 2008 + if (version_compare($this->version(), '10', '>=')) + { + return parent::_insert_batch($table, $keys, $values); + } + + return ($this->db_debug) ? $this->display_error('db_unsupported_feature') : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @return void + */ + protected function _close() + { + sqlsrv_close($this->conn_id); + } + +} diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php new file mode 100644 index 0000000..01547e8 --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -0,0 +1,149 @@ + 'SMALLINT', + 'SMALLINT' => 'INT', + 'INT' => 'BIGINT', + 'REAL' => 'FLOAT' + ); + + // -------------------------------------------------------------------- + + /** + * ALTER TABLE + * + * @param string $alter_type ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * @return string|string[] + */ + protected function _alter_table($alter_type, $table, $field) + { + if (in_array($alter_type, array('ADD', 'DROP'), TRUE)) + { + return parent::_alter_table($alter_type, $table, $field); + } + + $sql = 'ALTER TABLE '.$this->db->escape_identifiers($table).' ALTER COLUMN '; + $sqls = array(); + for ($i = 0, $c = count($field); $i < $c; $i++) + { + $sqls[] = $sql.$this->_process_column($field[$i]); + } + + return $sqls; + } + + // -------------------------------------------------------------------- + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + * + * @param array &$attributes + * @return void + */ + protected function _attr_type(&$attributes) + { + if (isset($attributes['CONSTRAINT']) && strpos($attributes['TYPE'], 'INT') !== FALSE) + { + unset($attributes['CONSTRAINT']); + } + + switch (strtoupper($attributes['TYPE'])) + { + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = FALSE; + return; + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + return; + default: return; + } + } + + // -------------------------------------------------------------------- + + /** + * Field attribute AUTO_INCREMENT + * + * @param array &$attributes + * @param array &$field + * @return void + */ + protected function _attr_auto_increment(&$attributes, &$field) + { + if ( ! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === TRUE && stripos($field['type'], 'int') !== FALSE) + { + $field['auto_increment'] = ' IDENTITY(1,1)'; + } + } + +} diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php new file mode 100644 index 0000000..1d0272f --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php @@ -0,0 +1,193 @@ +scrollable = $driver_object->scrollable; + } + + // -------------------------------------------------------------------- + + /** + * Number of rows in the result set + * + * @return int + */ + public function num_rows() + { + // sqlsrv_num_rows() doesn't work with the FORWARD and DYNAMIC cursors (FALSE is the same as FORWARD) + if ( ! in_array($this->scrollable, array(FALSE, SQLSRV_CURSOR_FORWARD, SQLSRV_CURSOR_DYNAMIC), TRUE)) + { + return parent::num_rows(); + } + + return is_int($this->num_rows) + ? $this->num_rows + : $this->num_rows = sqlsrv_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @return int + */ + public function num_fields() + { + return @sqlsrv_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @return array + */ + public function list_fields() + { + $field_names = array(); + foreach (sqlsrv_field_metadata($this->result_id) as $offset => $field) + { + $field_names[] = $field['Name']; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @return array + */ + public function field_data() + { + $retval = array(); + foreach (sqlsrv_field_metadata($this->result_id) as $i => $field) + { + $retval[$i] = new stdClass(); + $retval[$i]->name = $field['Name']; + $retval[$i]->type = $field['Type']; + $retval[$i]->max_length = $field['Size']; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return void + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + sqlsrv_free_stmt($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @return array + */ + protected function _fetch_assoc() + { + return sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @param string $class_name + * @return object + */ + protected function _fetch_object($class_name = 'stdClass') + { + return sqlsrv_fetch_object($this->result_id, $class_name); + } + +} diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php new file mode 100644 index 0000000..001107d --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -0,0 +1,77 @@ +db->display_error('db_unsupported_feature'); + } + +} diff --git a/system/database/index.html b/system/database/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/database/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/fonts/index.html b/system/fonts/index.html new file mode 100644 index 0000000..b702fbc --- /dev/null +++ b/system/fonts/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/system/fonts/texb.ttf b/system/fonts/texb.ttf new file mode 100644 index 0000000..383c88b Binary files /dev/null and b/system/fonts/texb.ttf differ diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php new file mode 100644 index 0000000..3d4a496 --- /dev/null +++ b/system/helpers/array_helper.php @@ -0,0 +1,115 @@ + '', + 'img_path' => '', + 'img_url' => '', + 'img_width' => '150', + 'img_height' => '30', + 'font_path' => '', + 'expiration' => 7200, + 'word_length' => 8, + 'font_size' => 16, + 'img_id' => '', + 'pool' => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', + 'colors' => array( + 'background' => array(255,255,255), + 'border' => array(153,102,102), + 'text' => array(204,153,153), + 'grid' => array(255,182,182) + ) + ); + + foreach ($defaults as $key => $val) + { + if ( ! is_array($data) && empty($$key)) + { + $$key = $val; + } + else + { + $$key = isset($data[$key]) ? $data[$key] : $val; + } + } + + if ($img_path === '' OR $img_url === '' + OR ! is_dir($img_path) OR ! is_really_writable($img_path) + OR ! extension_loaded('gd')) + { + return FALSE; + } + + // ----------------------------------- + // Remove old images + // ----------------------------------- + + $now = microtime(TRUE); + + $current_dir = @opendir($img_path); + while ($filename = @readdir($current_dir)) + { + if (in_array(substr($filename, -4), array('.jpg', '.png')) + && (str_replace(array('.jpg', '.png'), '', $filename) + $expiration) < $now) + { + @unlink($img_path.$filename); + } + } + + @closedir($current_dir); + + // ----------------------------------- + // Do we have a "word" yet? + // ----------------------------------- + + if (empty($word)) + { + $word = ''; + $pool_length = strlen($pool); + $rand_max = $pool_length - 1; + + // PHP7 or a suitable polyfill + if (function_exists('random_int')) + { + try + { + for ($i = 0; $i < $word_length; $i++) + { + $word .= $pool[random_int(0, $rand_max)]; + } + } + catch (Exception $e) + { + // This means fallback to the next possible + // alternative to random_int() + $word = ''; + } + } + } + + if (empty($word)) + { + // Nobody will have a larger character pool than + // 256 characters, but let's handle it just in case ... + // + // No, I do not care that the fallback to mt_rand() can + // handle it; if you trigger this, you're very obviously + // trying to break it. -- Narf + if ($pool_length > 256) + { + return FALSE; + } + + // We'll try using the operating system's PRNG first, + // which we can access through CI_Security::get_random_bytes() + $security = get_instance()->security; + + // To avoid numerous get_random_bytes() calls, we'll + // just try fetching as much bytes as we need at once. + if (($bytes = $security->get_random_bytes($pool_length)) !== FALSE) + { + $byte_index = $word_index = 0; + while ($word_index < $word_length) + { + // Do we have more random data to use? + // It could be exhausted by previous iterations + // ignoring bytes higher than $rand_max. + if ($byte_index === $pool_length) + { + // No failures should be possible if the + // first get_random_bytes() call didn't + // return FALSE, but still ... + for ($i = 0; $i < 5; $i++) + { + if (($bytes = $security->get_random_bytes($pool_length)) === FALSE) + { + continue; + } + + $byte_index = 0; + break; + } + + if ($bytes === FALSE) + { + // Sadly, this means fallback to mt_rand() + $word = ''; + break; + } + } + + list(, $rand_index) = unpack('C', $bytes[$byte_index++]); + if ($rand_index > $rand_max) + { + continue; + } + + $word .= $pool[$rand_index]; + $word_index++; + } + } + } + + if (empty($word)) + { + for ($i = 0; $i < $word_length; $i++) + { + $word .= $pool[mt_rand(0, $rand_max)]; + } + } + elseif ( ! is_string($word)) + { + $word = (string) $word; + } + + // ----------------------------------- + // Determine angle and position + // ----------------------------------- + $length = strlen($word); + $angle = ($length >= 6) ? mt_rand(-($length-6), ($length-6)) : 0; + $x_axis = mt_rand(6, (360/$length)-16); + $y_axis = ($angle >= 0) ? mt_rand($img_height, $img_width) : mt_rand(6, $img_height); + + // Create image + // PHP.net recommends imagecreatetruecolor(), but it isn't always available + $im = function_exists('imagecreatetruecolor') + ? imagecreatetruecolor($img_width, $img_height) + : imagecreate($img_width, $img_height); + + // ----------------------------------- + // Assign colors + // ---------------------------------- + + is_array($colors) OR $colors = $defaults['colors']; + + foreach (array_keys($defaults['colors']) as $key) + { + // Check for a possible missing value + is_array($colors[$key]) OR $colors[$key] = $defaults['colors'][$key]; + $colors[$key] = imagecolorallocate($im, $colors[$key][0], $colors[$key][1], $colors[$key][2]); + } + + // Create the rectangle + ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $colors['background']); + + // ----------------------------------- + // Create the spiral pattern + // ----------------------------------- + $theta = 1; + $thetac = 7; + $radius = 16; + $circles = 20; + $points = 32; + + for ($i = 0, $cp = ($circles * $points) - 1; $i < $cp; $i++) + { + $theta += $thetac; + $rad = $radius * ($i / $points); + $x = ($rad * cos($theta)) + $x_axis; + $y = ($rad * sin($theta)) + $y_axis; + $theta += $thetac; + $rad1 = $radius * (($i + 1) / $points); + $x1 = ($rad1 * cos($theta)) + $x_axis; + $y1 = ($rad1 * sin($theta)) + $y_axis; + imageline($im, $x, $y, $x1, $y1, $colors['grid']); + $theta -= $thetac; + } + + // ----------------------------------- + // Write the text + // ----------------------------------- + + $use_font = ($font_path !== '' && file_exists($font_path) && function_exists('imagettftext')); + if ($use_font === FALSE) + { + ($font_size > 5) && $font_size = 5; + $x = mt_rand(0, $img_width / ($length / 3)); + $y = 0; + } + else + { + ($font_size > 30) && $font_size = 30; + $x = mt_rand(0, $img_width / ($length / 1.5)); + $y = $font_size + 2; + } + + for ($i = 0; $i < $length; $i++) + { + if ($use_font === FALSE) + { + $y = mt_rand(0 , $img_height / 2); + imagestring($im, $font_size, $x, $y, $word[$i], $colors['text']); + $x += ($font_size * 2); + } + else + { + $y = mt_rand($img_height / 2, $img_height - 3); + imagettftext($im, $font_size, $angle, $x, $y, $colors['text'], $font_path, $word[$i]); + $x += $font_size; + } + } + + // Create the border + imagerectangle($im, 0, 0, $img_width - 1, $img_height - 1, $colors['border']); + + // ----------------------------------- + // Generate the image + // ----------------------------------- + $img_url = rtrim($img_url, '/').'/'; + + if (function_exists('imagejpeg')) + { + $img_filename = $now.'.jpg'; + imagejpeg($im, $img_path.$img_filename); + } + elseif (function_exists('imagepng')) + { + $img_filename = $now.'.png'; + imagepng($im, $img_path.$img_filename); + } + else + { + return FALSE; + } + + $img = ' '; + ImageDestroy($im); + + return array('word' => $word, 'time' => $now, 'image' => $img, 'filename' => $img_filename); + } +} diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php new file mode 100644 index 0000000..eccd2f3 --- /dev/null +++ b/system/helpers/cookie_helper.php @@ -0,0 +1,113 @@ +input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure, $httponly); + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('get_cookie')) +{ + /** + * Fetch an item from the COOKIE array + * + * @param string + * @param bool + * @return mixed + */ + function get_cookie($index, $xss_clean = NULL) + { + is_bool($xss_clean) OR $xss_clean = (config_item('global_xss_filtering') === TRUE); + $prefix = isset($_COOKIE[$index]) ? '' : config_item('cookie_prefix'); + return get_instance()->input->cookie($prefix.$index, $xss_clean); + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('delete_cookie')) +{ + /** + * Delete a COOKIE + * + * @param mixed + * @param string the cookie domain. Usually: .yourdomain.com + * @param string the cookie path + * @param string the cookie prefix + * @return void + */ + function delete_cookie($name, $domain = '', $path = '/', $prefix = '') + { + set_cookie($name, '', '', $domain, $path, $prefix); + } +} diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php new file mode 100644 index 0000000..eca1fc0 --- /dev/null +++ b/system/helpers/date_helper.php @@ -0,0 +1,742 @@ +format('j-n-Y G:i:s'), '%d-%d-%d %d:%d:%d', $day, $month, $year, $hour, $minute, $second); + + return mktime($hour, $minute, $second, $month, $day, $year); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('mdate')) +{ + /** + * Convert MySQL Style Datecodes + * + * This function is identical to PHPs date() function, + * except that it allows date codes to be formatted using + * the MySQL style, where each code letter is preceded + * with a percent sign: %Y %m %d etc... + * + * The benefit of doing dates this way is that you don't + * have to worry about escaping your text letters that + * match the date codes. + * + * @param string + * @param int + * @return int + */ + function mdate($datestr = '', $time = '') + { + if ($datestr === '') + { + return ''; + } + elseif (empty($time)) + { + $time = now(); + } + + $datestr = str_replace( + '%\\', + '', + preg_replace('/([a-z]+?){1}/i', '\\\\\\1', $datestr) + ); + + return date($datestr, $time); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('standard_date')) +{ + /** + * Standard Date + * + * Returns a date formatted according to the submitted standard. + * + * As of PHP 5.2, the DateTime extension provides constants that + * serve for the exact same purpose and are used with date(). + * + * @todo Remove in version 3.1+. + * @deprecated 3.0.0 Use PHP's native date() instead. + * @link http://www.php.net/manual/en/class.datetime.php#datetime.constants.types + * + * @example date(DATE_RFC822, now()); // default + * @example date(DATE_W3C, $time); // a different format and time + * + * @param string $fmt = 'DATE_RFC822' the chosen format + * @param int $time = NULL Unix timestamp + * @return string + */ + function standard_date($fmt = 'DATE_RFC822', $time = NULL) + { + if (empty($time)) + { + $time = now(); + } + + // Procedural style pre-defined constants from the DateTime extension + if (strpos($fmt, 'DATE_') !== 0 OR defined($fmt) === FALSE) + { + return FALSE; + } + + return date(constant($fmt), $time); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('timespan')) +{ + /** + * Timespan + * + * Returns a span of seconds in this format: + * 10 days 14 hours 36 minutes 47 seconds + * + * @param int a number of seconds + * @param int Unix timestamp + * @param int a number of display units + * @return string + */ + function timespan($seconds = 1, $time = '', $units = 7) + { + $CI =& get_instance(); + $CI->lang->load('date'); + + is_numeric($seconds) OR $seconds = 1; + is_numeric($time) OR $time = time(); + is_numeric($units) OR $units = 7; + + $seconds = ($time <= $seconds) ? 1 : $time - $seconds; + + $str = array(); + $years = floor($seconds / 31557600); + + if ($years > 0) + { + $str[] = $years.' '.$CI->lang->line($years > 1 ? 'date_years' : 'date_year'); + } + + $seconds -= $years * 31557600; + $months = floor($seconds / 2629743); + + if (count($str) < $units && ($years > 0 OR $months > 0)) + { + if ($months > 0) + { + $str[] = $months.' '.$CI->lang->line($months > 1 ? 'date_months' : 'date_month'); + } + + $seconds -= $months * 2629743; + } + + $weeks = floor($seconds / 604800); + + if (count($str) < $units && ($years > 0 OR $months > 0 OR $weeks > 0)) + { + if ($weeks > 0) + { + $str[] = $weeks.' '.$CI->lang->line($weeks > 1 ? 'date_weeks' : 'date_week'); + } + + $seconds -= $weeks * 604800; + } + + $days = floor($seconds / 86400); + + if (count($str) < $units && ($months > 0 OR $weeks > 0 OR $days > 0)) + { + if ($days > 0) + { + $str[] = $days.' '.$CI->lang->line($days > 1 ? 'date_days' : 'date_day'); + } + + $seconds -= $days * 86400; + } + + $hours = floor($seconds / 3600); + + if (count($str) < $units && ($days > 0 OR $hours > 0)) + { + if ($hours > 0) + { + $str[] = $hours.' '.$CI->lang->line($hours > 1 ? 'date_hours' : 'date_hour'); + } + + $seconds -= $hours * 3600; + } + + $minutes = floor($seconds / 60); + + if (count($str) < $units && ($days > 0 OR $hours > 0 OR $minutes > 0)) + { + if ($minutes > 0) + { + $str[] = $minutes.' '.$CI->lang->line($minutes > 1 ? 'date_minutes' : 'date_minute'); + } + + $seconds -= $minutes * 60; + } + + if (count($str) === 0) + { + $str[] = $seconds.' '.$CI->lang->line($seconds > 1 ? 'date_seconds' : 'date_second'); + } + + return implode(', ', $str); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('days_in_month')) +{ + /** + * Number of days in a month + * + * Takes a month/year as input and returns the number of days + * for the given month/year. Takes leap years into consideration. + * + * @param int a numeric month + * @param int a numeric year + * @return int + */ + function days_in_month($month = 0, $year = '') + { + if ($month < 1 OR $month > 12) + { + return 0; + } + elseif ( ! is_numeric($year) OR strlen($year) !== 4) + { + $year = date('Y'); + } + + if (defined('CAL_GREGORIAN')) + { + return cal_days_in_month(CAL_GREGORIAN, $month, $year); + } + + if ($year >= 1970) + { + return (int) date('t', mktime(12, 0, 0, $month, 1, $year)); + } + + if ($month == 2) + { + if ($year % 400 === 0 OR ($year % 4 === 0 && $year % 100 !== 0)) + { + return 29; + } + } + + $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); + return $days_in_month[$month - 1]; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('local_to_gmt')) +{ + /** + * Converts a local Unix timestamp to GMT + * + * @param int Unix timestamp + * @return int + */ + function local_to_gmt($time = '') + { + if ($time === '') + { + $time = time(); + } + + return mktime( + gmdate('G', $time), + gmdate('i', $time), + gmdate('s', $time), + gmdate('n', $time), + gmdate('j', $time), + gmdate('Y', $time) + ); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('gmt_to_local')) +{ + /** + * Converts GMT time to a localized value + * + * Takes a Unix timestamp (in GMT) as input, and returns + * at the local value based on the timezone and DST setting + * submitted + * + * @param int Unix timestamp + * @param string timezone + * @param bool whether DST is active + * @return int + */ + function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) + { + if ($time === '') + { + return now(); + } + + $time += timezones($timezone) * 3600; + + return ($dst === TRUE) ? $time + 3600 : $time; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('mysql_to_unix')) +{ + /** + * Converts a MySQL Timestamp to Unix + * + * @param int MySQL timestamp YYYY-MM-DD HH:MM:SS + * @return int Unix timstamp + */ + function mysql_to_unix($time = '') + { + // We'll remove certain characters for backward compatibility + // since the formatting changed with MySQL 4.1 + // YYYY-MM-DD HH:MM:SS + + $time = str_replace(array('-', ':', ' '), '', $time); + + // YYYYMMDDHHMMSS + return mktime( + substr($time, 8, 2), + substr($time, 10, 2), + substr($time, 12, 2), + substr($time, 4, 2), + substr($time, 6, 2), + substr($time, 0, 4) + ); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('unix_to_human')) +{ + /** + * Unix to "Human" + * + * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM + * + * @param int Unix timestamp + * @param bool whether to show seconds + * @param string format: us or euro + * @return string + */ + function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') + { + $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; + + if ($fmt === 'us') + { + $r .= date('h', $time).':'.date('i', $time); + } + else + { + $r .= date('H', $time).':'.date('i', $time); + } + + if ($seconds) + { + $r .= ':'.date('s', $time); + } + + if ($fmt === 'us') + { + return $r.' '.date('A', $time); + } + + return $r; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('human_to_unix')) +{ + /** + * Convert "human" date to GMT + * + * Reverses the above process + * + * @param string format: us or euro + * @return int + */ + function human_to_unix($datestr = '') + { + if ($datestr === '') + { + return FALSE; + } + + $datestr = preg_replace('/\040+/', ' ', trim($datestr)); + + if ( ! preg_match('/^(\d{2}|\d{4})\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) + { + return FALSE; + } + + sscanf($datestr, '%d-%d-%d %s %s', $year, $month, $day, $time, $ampm); + sscanf($time, '%d:%d:%d', $hour, $min, $sec); + isset($sec) OR $sec = 0; + + if (isset($ampm)) + { + $ampm = strtolower($ampm); + + if ($ampm[0] === 'p' && $hour < 12) + { + $hour += 12; + } + elseif ($ampm[0] === 'a' && $hour === 12) + { + $hour = 0; + } + } + + return mktime($hour, $min, $sec, $month, $day, $year); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('nice_date')) +{ + /** + * Turns many "reasonably-date-like" strings into something + * that is actually useful. This only works for dates after unix epoch. + * + * @deprecated 3.1.3 Use DateTime::createFromFormat($input_format, $input)->format($output_format); + * @param string The terribly formatted date-like string + * @param string Date format to return (same as php date function) + * @return string + */ + function nice_date($bad_date = '', $format = FALSE) + { + if (empty($bad_date)) + { + return 'Unknown'; + } + elseif (empty($format)) + { + $format = 'U'; + } + + // Date like: YYYYMM + if (preg_match('/^\d{6}$/i', $bad_date)) + { + if (in_array(substr($bad_date, 0, 2), array('19', '20'))) + { + $year = substr($bad_date, 0, 4); + $month = substr($bad_date, 4, 2); + } + else + { + $month = substr($bad_date, 0, 2); + $year = substr($bad_date, 2, 4); + } + + return date($format, strtotime($year.'-'.$month.'-01')); + } + + // Date Like: YYYYMMDD + if (preg_match('/^\d{8}$/i', $bad_date, $matches)) + { + return DateTime::createFromFormat('Ymd', $bad_date)->format($format); + } + + // Date Like: MM-DD-YYYY __or__ M-D-YYYY (or anything in between) + if (preg_match('/^(\d{1,2})-(\d{1,2})-(\d{4})$/i', $bad_date, $matches)) + { + return date($format, strtotime($matches[3].'-'.$matches[1].'-'.$matches[2])); + } + + // Any other kind of string, when converted into UNIX time, + // produces "0 seconds after epoc..." is probably bad... + // return "Invalid Date". + if (date('U', strtotime($bad_date)) === '0') + { + return 'Invalid Date'; + } + + // It's probably a valid-ish date format already + return date($format, strtotime($bad_date)); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('timezone_menu')) +{ + /** + * Timezone Menu + * + * Generates a drop-down menu of timezones. + * + * @param string timezone + * @param string classname + * @param string menu name + * @param mixed attributes + * @return string + */ + function timezone_menu($default = 'UTC', $class = '', $name = 'timezones', $attributes = '') + { + $CI =& get_instance(); + $CI->lang->load('date'); + + $default = ($default === 'GMT') ? 'UTC' : $default; + + $menu = ''; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('timezones')) +{ + /** + * Timezones + * + * Returns an array of timezones. This is a helper function + * for various other ones in this library + * + * @param string timezone + * @return string + */ + function timezones($tz = '') + { + // Note: Don't change the order of these even though + // some items appear to be in the wrong order + + $zones = array( + 'UM12' => -12, + 'UM11' => -11, + 'UM10' => -10, + 'UM95' => -9.5, + 'UM9' => -9, + 'UM8' => -8, + 'UM7' => -7, + 'UM6' => -6, + 'UM5' => -5, + 'UM45' => -4.5, + 'UM4' => -4, + 'UM35' => -3.5, + 'UM3' => -3, + 'UM2' => -2, + 'UM1' => -1, + 'UTC' => 0, + 'UP1' => +1, + 'UP2' => +2, + 'UP3' => +3, + 'UP35' => +3.5, + 'UP4' => +4, + 'UP45' => +4.5, + 'UP5' => +5, + 'UP55' => +5.5, + 'UP575' => +5.75, + 'UP6' => +6, + 'UP65' => +6.5, + 'UP7' => +7, + 'UP8' => +8, + 'UP875' => +8.75, + 'UP9' => +9, + 'UP95' => +9.5, + 'UP10' => +10, + 'UP105' => +10.5, + 'UP11' => +11, + 'UP115' => +11.5, + 'UP12' => +12, + 'UP1275' => +12.75, + 'UP13' => +13, + 'UP14' => +14 + ); + + if ($tz === '') + { + return $zones; + } + + return isset($zones[$tz]) ? $zones[$tz] : 0; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('date_range')) +{ + /** + * Date range + * + * Returns a list of dates within a specified period. + * + * @param int unix_start UNIX timestamp of period start date + * @param int unix_end|days UNIX timestamp of period end date + * or interval in days. + * @param mixed is_unix Specifies whether the second parameter + * is a UNIX timestamp or a day interval + * - TRUE or 'unix' for a timestamp + * - FALSE or 'days' for an interval + * @param string date_format Output date format, same as in date() + * @return array + */ + function date_range($unix_start = '', $mixed = '', $is_unix = TRUE, $format = 'Y-m-d') + { + if ($unix_start == '' OR $mixed == '' OR $format == '') + { + return FALSE; + } + + $is_unix = ! ( ! $is_unix OR $is_unix === 'days'); + + // Validate input and try strtotime() on invalid timestamps/intervals, just in case + if ( ( ! ctype_digit((string) $unix_start) && ($unix_start = @strtotime($unix_start)) === FALSE) + OR ( ! ctype_digit((string) $mixed) && ($is_unix === FALSE OR ($mixed = @strtotime($mixed)) === FALSE)) + OR ($is_unix === TRUE && $mixed < $unix_start)) + { + return FALSE; + } + + if ($is_unix && ($unix_start == $mixed OR date($format, $unix_start) === date($format, $mixed))) + { + return array(date($format, $unix_start)); + } + + $range = array(); + + $from = new DateTime(); + $from->setTimestamp($unix_start); + + if ($is_unix) + { + $arg = new DateTime(); + $arg->setTimestamp($mixed); + } + else + { + $arg = (int) $mixed; + } + + $period = new DatePeriod($from, new DateInterval('P1D'), $arg); + foreach ($period as $date) + { + $range[] = $date->format($format); + } + + /* If a period end date was passed to the DatePeriod constructor, it might not + * be in our results. Not sure if this is a bug or it's just possible because + * the end date might actually be less than 24 hours away from the previously + * generated DateTime object, but either way - we have to append it manually. + */ + if ( ! is_int($arg) && $range[count($range) - 1] !== $arg->format($format)) + { + $range[] = $arg->format($format); + } + + return $range; + } +} diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php new file mode 100644 index 0000000..0d3f205 --- /dev/null +++ b/system/helpers/directory_helper.php @@ -0,0 +1,101 @@ + 0) && is_dir($source_dir.$file)) + { + $filedata[$file] = directory_map($source_dir.$file, $new_depth, $hidden); + } + else + { + $filedata[] = $file; + } + } + + closedir($fp); + return $filedata; + } + + return FALSE; + } +} diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php new file mode 100644 index 0000000..a9bea94 --- /dev/null +++ b/system/helpers/download_helper.php @@ -0,0 +1,158 @@ + 0) + ? @rmdir($path) + : TRUE; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('get_filenames')) +{ + /** + * Get Filenames + * + * Reads the specified directory and builds an array containing the filenames. + * Any sub-folders contained within the specified path are read as well. + * + * @param string path to source + * @param bool whether to include the path as part of the filename + * @param bool internal variable to determine recursion status - do not use in calls + * @return array + */ + function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE) + { + static $_filedata = array(); + + if ($fp = @opendir($source_dir)) + { + // reset the array and make sure $source_dir has a trailing slash on the initial call + if ($_recursion === FALSE) + { + $_filedata = array(); + $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + } + + while (FALSE !== ($file = readdir($fp))) + { + if (is_dir($source_dir.$file) && $file[0] !== '.') + { + get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE); + } + elseif ($file[0] !== '.') + { + $_filedata[] = ($include_path === TRUE) ? $source_dir.$file : $file; + } + } + + closedir($fp); + return $_filedata; + } + + return FALSE; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('get_dir_file_info')) +{ + /** + * Get Directory File Information + * + * Reads the specified directory and builds an array containing the filenames, + * filesize, dates, and permissions + * + * Any sub-folders contained within the specified path are read as well. + * + * @param string path to source + * @param bool Look only at the top level directory specified? + * @param bool internal variable to determine recursion status - do not use in calls + * @return array + */ + function get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FALSE) + { + static $_filedata = array(); + $relative_path = $source_dir; + + if ($fp = @opendir($source_dir)) + { + // reset the array and make sure $source_dir has a trailing slash on the initial call + if ($_recursion === FALSE) + { + $_filedata = array(); + $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + } + + // Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast + while (FALSE !== ($file = readdir($fp))) + { + if (is_dir($source_dir.$file) && $file[0] !== '.' && $top_level_only === FALSE) + { + get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, TRUE); + } + elseif ($file[0] !== '.') + { + $_filedata[$file] = get_file_info($source_dir.$file); + $_filedata[$file]['relative_path'] = $relative_path; + } + } + + closedir($fp); + return $_filedata; + } + + return FALSE; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('get_file_info')) +{ + /** + * Get File Info + * + * Given a file and path, returns the name, path, size, date modified + * Second parameter allows you to explicitly declare what information you want returned + * Options are: name, server_path, size, date, readable, writable, executable, fileperms + * Returns FALSE if the file cannot be found. + * + * @param string path to file + * @param mixed array or comma separated string of information returned + * @return array + */ + function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date')) + { + if ( ! file_exists($file)) + { + return FALSE; + } + + if (is_string($returned_values)) + { + $returned_values = explode(',', $returned_values); + } + + foreach ($returned_values as $key) + { + switch ($key) + { + case 'name': + $fileinfo['name'] = basename($file); + break; + case 'server_path': + $fileinfo['server_path'] = $file; + break; + case 'size': + $fileinfo['size'] = filesize($file); + break; + case 'date': + $fileinfo['date'] = filemtime($file); + break; + case 'readable': + $fileinfo['readable'] = is_readable($file); + break; + case 'writable': + $fileinfo['writable'] = is_really_writable($file); + break; + case 'executable': + $fileinfo['executable'] = is_executable($file); + break; + case 'fileperms': + $fileinfo['fileperms'] = fileperms($file); + break; + } + } + + return $fileinfo; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('get_mime_by_extension')) +{ + /** + * Get Mime by Extension + * + * Translates a file extension into a mime type based on config/mimes.php. + * Returns FALSE if it can't determine the type, or open the mime config file + * + * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience + * It should NOT be trusted, and should certainly NOT be used for security + * + * @param string $filename File name + * @return string + */ + function get_mime_by_extension($filename) + { + static $mimes; + + if ( ! is_array($mimes)) + { + $mimes = get_mimes(); + + if (empty($mimes)) + { + return FALSE; + } + } + + $extension = strtolower(substr(strrchr($filename, '.'), 1)); + + if (isset($mimes[$extension])) + { + return is_array($mimes[$extension]) + ? current($mimes[$extension]) // Multiple mime types, just give the first one + : $mimes[$extension]; + } + + return FALSE; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('symbolic_permissions')) +{ + /** + * Symbolic Permissions + * + * Takes a numeric value representing a file's permissions and returns + * standard symbolic notation representing that value + * + * @param int $perms Permissions + * @return string + */ + function symbolic_permissions($perms) + { + if (($perms & 0xC000) === 0xC000) + { + $symbolic = 's'; // Socket + } + elseif (($perms & 0xA000) === 0xA000) + { + $symbolic = 'l'; // Symbolic Link + } + elseif (($perms & 0x8000) === 0x8000) + { + $symbolic = '-'; // Regular + } + elseif (($perms & 0x6000) === 0x6000) + { + $symbolic = 'b'; // Block special + } + elseif (($perms & 0x4000) === 0x4000) + { + $symbolic = 'd'; // Directory + } + elseif (($perms & 0x2000) === 0x2000) + { + $symbolic = 'c'; // Character special + } + elseif (($perms & 0x1000) === 0x1000) + { + $symbolic = 'p'; // FIFO pipe + } + else + { + $symbolic = 'u'; // Unknown + } + + // Owner + $symbolic .= (($perms & 0x0100) ? 'r' : '-') + .(($perms & 0x0080) ? 'w' : '-') + .(($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); + + // Group + $symbolic .= (($perms & 0x0020) ? 'r' : '-') + .(($perms & 0x0010) ? 'w' : '-') + .(($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); + + // World + $symbolic .= (($perms & 0x0004) ? 'r' : '-') + .(($perms & 0x0002) ? 'w' : '-') + .(($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); + + return $symbolic; + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('octal_permissions')) +{ + /** + * Octal Permissions + * + * Takes a numeric value representing a file's permissions and returns + * a three character string representing the file's octal permissions + * + * @param int $perms Permissions + * @return string + */ + function octal_permissions($perms) + { + return substr(sprintf('%o', $perms), -3); + } +} diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php new file mode 100644 index 0000000..8746045 --- /dev/null +++ b/system/helpers/form_helper.php @@ -0,0 +1,1055 @@ +config->site_url($CI->uri->uri_string()); + } + // If an action is not a full URL then turn it into one + elseif (strpos($action, '://') === FALSE) + { + $action = $CI->config->site_url($action); + } + + $attributes = _attributes_to_string($attributes); + + if (stripos($attributes, 'method=') === FALSE) + { + $attributes .= ' method="post"'; + } + + if (stripos($attributes, 'accept-charset=') === FALSE) + { + $attributes .= ' accept-charset="'.strtolower(config_item('charset')).'"'; + } + + $form = '
    \n"; + + if (is_array($hidden)) + { + foreach ($hidden as $name => $value) + { + $form .= ''."\n"; + } + } + + // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites + if ($CI->config->item('csrf_protection') === TRUE && strpos($action, $CI->config->base_url()) !== FALSE && ! stripos($form, 'method="get"')) + { + // Prepend/append random-length "white noise" around the CSRF + // token input, as a form of protection against BREACH attacks + if (FALSE !== ($noise = $CI->security->get_random_bytes(1))) + { + list(, $noise) = unpack('c', $noise); + } + else + { + $noise = mt_rand(-128, 127); + } + + // Prepend if $noise has a negative value, append if positive, do nothing for zero + $prepend = $append = ''; + if ($noise < 0) + { + $prepend = str_repeat(" ", abs($noise)); + } + elseif ($noise > 0) + { + $append = str_repeat(" ", $noise); + } + + $form .= sprintf( + '%s%s%s', + $prepend, + $CI->security->get_csrf_token_name(), + $CI->security->get_csrf_hash(), + $append, + "\n" + ); + } + + return $form; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_open_multipart')) +{ + /** + * Form Declaration - Multipart type + * + * Creates the opening portion of the form, but with "multipart/form-data". + * + * @param string the URI segments of the form destination + * @param array a key/value pair of attributes + * @param array a key/value pair hidden data + * @return string + */ + function form_open_multipart($action = '', $attributes = array(), $hidden = array()) + { + if (is_string($attributes)) + { + $attributes .= ' enctype="multipart/form-data"'; + } + else + { + $attributes['enctype'] = 'multipart/form-data'; + } + + return form_open($action, $attributes, $hidden); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_hidden')) +{ + /** + * Hidden Input Field + * + * Generates hidden fields. You can pass a simple key/value string or + * an associative array with multiple values. + * + * @param mixed $name Field name + * @param string $value Field value + * @param bool $recursing + * @return string + */ + function form_hidden($name, $value = '', $recursing = FALSE) + { + static $form; + + if ($recursing === FALSE) + { + $form = "\n"; + } + + if (is_array($name)) + { + foreach ($name as $key => $val) + { + form_hidden($key, $val, TRUE); + } + + return $form; + } + + if ( ! is_array($value)) + { + $form .= '\n"; + } + else + { + foreach ($value as $k => $v) + { + $k = is_int($k) ? '' : $k; + form_hidden($name.'['.$k.']', $v, TRUE); + } + } + + return $form; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_input')) +{ + /** + * Text Input Field + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_input($data = '', $value = '', $extra = '') + { + $defaults = array( + 'type' => 'text', + 'name' => is_array($data) ? '' : $data, + 'value' => $value + ); + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_password')) +{ + /** + * Password Field + * + * Identical to the input function but adds the "password" type + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_password($data = '', $value = '', $extra = '') + { + is_array($data) OR $data = array('name' => $data); + $data['type'] = 'password'; + return form_input($data, $value, $extra); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_upload')) +{ + /** + * Upload Field + * + * Identical to the input function but adds the "file" type + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_upload($data = '', $value = '', $extra = '') + { + $defaults = array('type' => 'file', 'name' => ''); + is_array($data) OR $data = array('name' => $data); + $data['type'] = 'file'; + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_textarea')) +{ + /** + * Textarea field + * + * @param mixed $data + * @param string $value + * @param mixed $extra + * @return string + */ + function form_textarea($data = '', $value = '', $extra = '') + { + $defaults = array( + 'name' => is_array($data) ? '' : $data, + 'cols' => '40', + 'rows' => '10' + ); + + if ( ! is_array($data) OR ! isset($data['value'])) + { + $val = $value; + } + else + { + $val = $data['value']; + unset($data['value']); // textareas don't use the value attribute + } + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_multiselect')) +{ + /** + * Multi-select menu + * + * @param string + * @param array + * @param mixed + * @param mixed + * @return string + */ + function form_multiselect($name = '', $options = array(), $selected = array(), $extra = '') + { + $extra = _attributes_to_string($extra); + if (stripos($extra, 'multiple') === FALSE) + { + $extra .= ' multiple="multiple"'; + } + + return form_dropdown($name, $options, $selected, $extra); + } +} + +// -------------------------------------------------------------------- + +if ( ! function_exists('form_dropdown')) +{ + /** + * Drop-down Menu + * + * @param mixed $data + * @param mixed $options + * @param mixed $selected + * @param mixed $extra + * @return string + */ + function form_dropdown($data = '', $options = array(), $selected = array(), $extra = '') + { + $defaults = array(); + + if (is_array($data)) + { + if (isset($data['selected'])) + { + $selected = $data['selected']; + unset($data['selected']); // select tags don't have a selected attribute + } + + if (isset($data['options'])) + { + $options = $data['options']; + unset($data['options']); // select tags don't use an options attribute + } + } + else + { + $defaults = array('name' => $data); + } + + is_array($selected) OR $selected = array($selected); + is_array($options) OR $options = array($options); + + // If no selected state was submitted we will attempt to set it automatically + if (empty($selected)) + { + if (is_array($data)) + { + if (isset($data['name'], $_POST[$data['name']])) + { + $selected = array($_POST[$data['name']]); + } + } + elseif (isset($_POST[$data])) + { + $selected = array($_POST[$data]); + } + } + + $extra = _attributes_to_string($extra); + + $multiple = (count($selected) > 1 && stripos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : ''; + + $form = '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_checkbox')) +{ + /** + * Checkbox Field + * + * @param mixed + * @param string + * @param bool + * @param mixed + * @return string + */ + function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '') + { + $defaults = array('type' => 'checkbox', 'name' => ( ! is_array($data) ? $data : ''), 'value' => $value); + + if (is_array($data) && array_key_exists('checked', $data)) + { + $checked = $data['checked']; + + if ($checked == FALSE) + { + unset($data['checked']); + } + else + { + $data['checked'] = 'checked'; + } + } + + if ($checked == TRUE) + { + $defaults['checked'] = 'checked'; + } + else + { + unset($defaults['checked']); + } + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_radio')) +{ + /** + * Radio Button + * + * @param mixed + * @param string + * @param bool + * @param mixed + * @return string + */ + function form_radio($data = '', $value = '', $checked = FALSE, $extra = '') + { + is_array($data) OR $data = array('name' => $data); + $data['type'] = 'radio'; + + return form_checkbox($data, $value, $checked, $extra); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_submit')) +{ + /** + * Submit Button + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_submit($data = '', $value = '', $extra = '') + { + $defaults = array( + 'type' => 'submit', + 'name' => is_array($data) ? '' : $data, + 'value' => $value + ); + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_reset')) +{ + /** + * Reset Button + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_reset($data = '', $value = '', $extra = '') + { + $defaults = array( + 'type' => 'reset', + 'name' => is_array($data) ? '' : $data, + 'value' => $value + ); + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_button')) +{ + /** + * Form Button + * + * @param mixed + * @param string + * @param mixed + * @return string + */ + function form_button($data = '', $content = '', $extra = '') + { + $defaults = array( + 'name' => is_array($data) ? '' : $data, + 'type' => 'button' + ); + + if (is_array($data) && isset($data['content'])) + { + $content = $data['content']; + unset($data['content']); // content is not an attribute + } + + return '\n"; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_label')) +{ + /** + * Form Label Tag + * + * @param string The text to appear onscreen + * @param string The id the label applies to + * @param mixed Additional attributes + * @return string + */ + function form_label($label_text = '', $id = '', $attributes = array()) + { + + $label = ''.$label_text.''; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_fieldset')) +{ + /** + * Fieldset Tag + * + * Used to produce
    text. To close fieldset + * use form_fieldset_close() + * + * @param string The legend text + * @param array Additional attributes + * @return string + */ + function form_fieldset($legend_text = '', $attributes = array()) + { + $fieldset = '\n"; + if ($legend_text !== '') + { + return $fieldset.''.$legend_text."\n"; + } + + return $fieldset; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_fieldset_close')) +{ + /** + * Fieldset Close Tag + * + * @param string + * @return string + */ + function form_fieldset_close($extra = '') + { + return '
    '.$extra; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_close')) +{ + /** + * Form Close Tag + * + * @param string + * @return string + */ + function form_close($extra = '') + { + return ''.$extra; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('form_prep')) +{ + /** + * Form Prep + * + * Formats text so that it can be safely placed in a form field in the event it has HTML tags. + * + * @deprecated 3.0.0 An alias for html_escape() + * @param string|string[] $str Value to escape + * @return string|string[] Escaped values + */ + function form_prep($str) + { + return html_escape($str, TRUE); + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('set_value')) +{ + /** + * Form Value + * + * Grabs a value from the POST array for the specified field so you can + * re-populate an input field or textarea. If Form Validation + * is active it retrieves the info from the validation class + * + * @param string $field Field name + * @param string $default Default value + * @param bool $html_escape Whether to escape HTML special characters or not + * @return string + */ + function set_value($field, $default = '', $html_escape = TRUE) + { + $CI =& get_instance(); + + $value = (isset($CI->form_validation) && is_object($CI->form_validation) && $CI->form_validation->has_rule($field)) + ? $CI->form_validation->set_value($field, $default) + : $CI->input->post($field, FALSE); + + isset($value) OR $value = $default; + return ($html_escape) ? html_escape($value) : $value; + } +} + +// ------------------------------------------------------------------------ + +if ( ! function_exists('set_select')) +{ + /** + * Set Select + * + * Let's you set the selected value of a